题目的难点在于,当牛妹消除某一行时,会影响每一列和的大小。我们不妨先选定要消除的行,再改变这些行影响的列,最后对列进行贪心,而不是同时关注行和列的变化。 我们枚举出消除行的每一种情况,并计算在这些情况下我们是否可以继续加上一些列、要加上哪些列(排序)。 #include<iostream> #include<algorithm> #include<bits/stdc++.h> using namespace std; int a[20][20]; int col[20]; int n,m,k; int cnt=0;//当前选了几行 bool cmp(int x,int y) { return x>y; } int calc(int x) { int sum=0; for(int i=0;i<n;i++) { if(x>>i&1==1) { for(int j=0;j<m;j++) sum+=a[i][j]; cnt++; } else{ for(int j=0;j<m;j++) col[j]+=a[i][j]; } } return sum; } int main() { scanf("%d%d%d",&n,&m,&k); int tempsum=0; for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { scanf("%d",&a[i][j]); tempsum+=a[i][j]; } } if(m<=k||n<=k) { cout<<tempsum; return 0; } int res=0; for(int i=0;i<(1<<n);i++) { memset(col,0,sizeof(col)); cnt=0; int sum=calc(i); int cntcol=k-cnt; if(cnt>k||cntcol>m) continue; else { sort(col,col+m,cmp); for(int i=0;i<cntcol;i++) sum+=col[i]; } res=max(sum,res); } printf("%d",res); }