矩阵消除游戏
矩阵消除游戏
https://ac.nowcoder.com/acm/problem/200190
思路:
贪心+枚举
1.如果,那么我们可以把矩阵全部拿完,此时令是不影响结果的,同时可以避免后面处理时把这种情况跳过了。
2.枚举选那几行的情况通过二进制表示,标记那几行选了用01串表示,1表示选,0表示不选。
3.确定了行后,计算每一列的和,剩下的次数选列的和最大的。
还不明白可以去看雨巨的讲解。
Code:
#include<bits/stdc++.h> using namespace std; int n,m,k,a[20][20]; long long sh[20],sl[20],ans; bool b[20]; bool cmp(int a,int b) { return a>b; } int deal(int x) { memset(b,0,sizeof b); int cnt=0,i=1; while(x) { if(x&1) { ++cnt; b[i]=1; } x>>=1; ++i; } return cnt; } int main() { scanf("%d%d%d",&n,&m,&k); for(int i=1;i<=n;++i) for(int j=1;j<=m;++j) { scanf("%d",&a[i][j]); sh[i]+=a[i][j]; } if (k > n) k=n; if (k > m) k=m; int tmp=(1<<n)-1; for(int x=0;x<=tmp;++x) { int numh=deal(x); int numl=k-numh; if(numl<0) continue; long long sum=0; for (int i = 1; i <= n; i++) if(b[i]) sum+=sh[i]; memset(sl, 0, sizeof(sl)); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if(!b[i]) sl[j]+=a[i][j]; sort(sl+1, sl+1+m,cmp); for(int i=1;i<=numl;++i) sum += sl[i]; ans=max(ans,sum); } printf("%lld\n", ans); return 0; }
牛客算法竞赛入门课第一节例题、习题 文章被收录于专栏
为雨巨打call