鏈接:https://ac.nowcoder.com/acm/contest/4090/C
牛妹在玩一個名爲矩陣消除的遊戲,矩陣的大小是{n}n行{m}m列,第{i}i行第{j}j列的單元格的權值爲a_{i,j}ai,j,牛妹可以進行{k}k個回合的遊戲,在每個回合,牛妹可以選擇一行或者選擇一列,然後將這一行或者這一列的所有單元格中的權值變爲{0}0,同時牛妹的分數會加上這一行或者這一列中的所有單元格的權值的和。
牛妹想最大化她的得分,球球你幫幫她吧!
輸入描述:
第一行三個整數{n,m,k}n,m,k 接下來{n}n行每行{m}m個整數表示矩陣中各個單元格的權值。
輸出描述:
輸出一個整數表示牛妹能獲得的最大分數。
示例1
輸入
3 3 2 101 1 102 1 202 1 100 8 100
輸出
414
備註:
1\leq n,m\leq 151≤n,m≤15
1\leq a_{i,j}\leq 1e61≤ai,j≤1e6
1\leq k\leq n*m1≤k≤n∗m
代碼:
#include <bits/stdc++.h>
using namespace std;
long long n,m,k,s=0;
long long a[20][20],b[20][20];
long long c[20],max1,p[20];
void dfs(int id,long long sum,int t,int tip)
{
if(tip==t)
{
for(int i=1;i<=m;i++)
{
p[i]=0;
for(int j=1;j<=n;j++)
{
if(c[j]==0)
p[i]+=a[j][i];
}
}
sort(p+1,p+1+m);
for(int i=m;i>=1;i--)
{
if(t==k)
break;
else
{
t++;
sum+=p[i];
}
}
max1=max(max1,sum);
return;
}
if(id>n)
return;
c[id]=1;
long long ss=0;
for(int i=1;i<=m;i++)
{
ss+=a[id][i];
}
dfs(id+1,sum+ss,t,tip+1);
c[id]=0;
dfs(id+1,sum,t,tip);
}
void bfs(int id,long long sum,int t,int tip)
{
if(tip==t)
{
for(int i=1;i<=n;i++)
{
p[i]=0;
for(int j=1;j<=m;j++)
{
if(c[j]==0)
p[i]+=a[i][j];
}
}
sort(p+1,p+1+n);
for(int i=n;i>=1;i--)
{
if(t==k)
break;
else
{
t++;
sum+=p[i];
}
}
max1=max(max1,sum);
return;
}
if(id>m)
return;
c[id]=1;
long long ss=0;
for(int i=1;i<=n;i++)
{
ss+=a[i][id];
}
bfs(id+1,sum+ss,t,tip+1);
c[id]=0;
bfs(id+1,sum,t,tip);
}
int main()
{
cin>>n>>m>>k;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>a[i][j];
s+=a[i][j];
}
}
if(k>=min(n,m))
{
cout<<s<<endl;
}
else
{
s=0;
if(n<=m)
{
max1=0;
for(int i=0;i<=k;i++)
{
memset(c,0,sizeof(c));
dfs(1,0,i,0);
}
cout<<max1<<endl;
}
else
{
max1=0;
for(int i=0;i<=k;i++)
{
memset(c,0,sizeof(c));
bfs(1,0,i,0);
}
cout<<max1<<endl;
}
}
}