NC200190-矩阵消除游戏
题目链接:https://ac.nowcoder.com/acm/problem/200190
思路:二进制枚举行的情况,然后根据选中了那些行去计算每列的值,贪心选取需要的列数。
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int a[20][20];
int num[20];
int main (){
int n,m,k;
cin>>n>>m>>k;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>a[i][j];
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++)
{
a[i][0]+=a[i][j];///存储每行和
a[0][j]+=a[i][j];///存储每列和
}
}
int ans=0,res=0;
for(int i=0;i<=(1<<(n+1))-1;i++){
res=0;
int book=0;
for(int j=1;j<=m;j++)
num[j]=a[0][j];
for(int j=0;j<n;j++){
if((i>>j) &1){
res+=a[j+1][0];
for(int s=1;s<=m;s++)
num[s]-=a[j+1][s];
book++;
}
}
if(book>k)continue;
sort(num+1,num+n+1,greater<int>());
for(int j=1;j<=min(m,(k-book));j++)
res+=num[j];
ans=max(ans,res);
}
cout<<ans<<endl;
return 0;
}

浙公网安备 33010602011771号