矩陣消除遊戲

行於其野發表於2020-09-29

矩陣消除遊戲

連結:https://ac.nowcoder.com/acm/problem/200190
來源:牛客網
題目描述:
牛妹在玩一個名為矩陣消除的遊戲,矩陣的大小是n行m列,第i行第j列的單元格的權值為ai,j,牛妹可以進行k個回合的遊戲,在每個回合,牛妹可以選擇一行或者選擇一列,然後將這一行或者這一列的所有單元格中的權值變為0,同時牛妹的分數會加上這一行或者這一列中的所有單元格的權值的和。
牛妹想最大化她的得分,球球你幫幫她吧!
示例1:
輸入
3 3 2
101 1 102
1 202 1
100 8 100
輸出
414
解題思路:
二進位制暴力列舉消除sl行,然後選擇最大的k-sl列
AC程式碼

#include <iostream>
#include <algorithm>
#include <string.h>
#include<math.h>
#include <queue>
#include<map>
using namespace std;

typedef long long ll;
#define M 20
int n,m,k;
int a[M][M];
int l[M];
int h[M];
int b[M];
bool cmp(int q,int w)
{
    return q>w;
}
int ope(int x)
{
    memset(b,0,sizeof(b));
    int i=1,ans=0;
    while(x)
    {
        if(x&1)
            {
                b[i]=1;
                ans++;
            }
        i++;
        x>>=1;
    }
    //cout <<"ans="<<ans<<endl;
    return ans;
}
int main()
{
    ll maxx=0;
    cin >> n >>m>>k;
    memset(l,0,sizeof(l));
    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=m; j++)
        {
            cin >>a[i][j];
            l[i]+=a[i][j];
        }
    }
    for(int i=0;i<=((1<<n)-1);i++)//列舉行
    {
        memset(h,0,sizeof(h));
        int sl=ope(i),sh=k-sl;
        if(sh<0||sh>m)
            continue;
        ll sum=0;
        for(int j=1;j<=n;j++)
        {
            if(b[j])
                sum+=l[j];
        }
        for(int k=1;k<=n;k++)
        {
            for(int j=1;j<=m;j++)
            {
                if(!b[k])
                    h[j]+=a[k][j];
            }
        }
        sort(h+1,h+m+1,cmp);
        for(int j=1;j<=sh;j++)//選擇最大的sh列
        {
            sum+=h[j];
        }
        //cout <<sum<<endl;
        maxx=max(maxx,sum);
    }
    cout <<maxx;
    return 0;
}

相關文章