矩阵消除游戏
矩阵消除游戏
https://ac.nowcoder.com/acm/problem/200190
题意:
有一个n*m的矩阵,你可以进行k回合的游戏,每一回合将矩阵的一行或者一列的值置零并将分数加上。求你最后最多能得多少分?
思路:
由于消除行对列有影响,所以不能简单的贪心,但你n和m小于15,所以我可以枚举消除列的状态,然后对每一种合理状态再对行进行贪心操作,然后取最大分数值。
代码:
#include<bits/stdc++.h>
#define ll long long
#define inf 1000000007
using namespace std;
inline int read()
{
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}
int d[20][20], n, m, rl[20], cl[20], r[20], ki;
bool cmp(int a,int b)
{
return a>b;
}
int main()
{
scanf("%d%d%d",&n,&m,&ki);
for(int i=0; i<n; i++)
{
rl[i]=0;
for(int j=0; j<m; j++)
{
scanf("%d",&d[i][j]);
rl[i]+=d[i][j];
}
}
for(int j=0; j<m; j++)
{
cl[j]=0;
for(int i=0; i<n; i++)
{
cl[j]+=d[i][j];
}
}
int k=0;
int pa=(1<<m);
int ans=0;
for(;k<pa;k++)
{
int sum=0, pan=ki;
memset(r,0,sizeof(r));
for(int j=0; j<m; j++)
{
if((k>>j)&1)
{
pan--;
sum=sum+cl[j];
}
else
{
for(int i=0; i<n; i++)
{
r[i]+=d[i][j];
}
}
}
if(pan<0)
{
continue;
}
sort(r,r+n,cmp);
for(int i=0;i<pan&&i<n;i++)
{
sum=sum+r[i];
}
ans=max(sum,ans);
}
cout << ans << endl;
return 0;
}
阿里云工作强度 667人发布