牛妹在玩一个名为矩阵消除的游戏,矩阵的大小是行列,第行第列的单元格的权值为,牛妹可以进行个回合的游戏,在每个回合,牛妹可以选择一行或者选择一列,然后将这一行或者这一列的所有单元格中的权值变为,同时牛妹的分数会加上这一行或者这一列中的所有单元格的权值的和。
牛妹想最大化她的得分,球球你帮帮她吧!
输入描述:
第一行三个整数
接下来行每行个整数表示矩阵中各个单元格的权值。
输出描述:
输出一个整数表示牛妹能获得的最大分数。
示例1
输入
3 3 2
101 1 102
1 202 1
100 8 100
输出
414
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n, m, k;
ll a[16][16], b[20];
int main()
{
cin >> n >> m >> k;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
{
cin >> a[i][j];
a[0][j] += a[i][j];
a[i][0] += a[i][j];
}
int mei = (1 << n) - 1, sum1 = 0;
for(int i = 0; i <= mei; i++)
{
int ans = 0, ans1 = 0, sum = 0, h = i;
for(int j = 1; j <= m; j++)
b[j] = a[0][j];
while(h)
{
ans1++;
if(h%2==1)
{
ans++;
sum += a[ans1][0];
for(int j = 1; j <= m; j++)
b[j] -= a[ans1][j];
}
h >>= 1;
}
if(ans > k) continue;
int w = k - ans;
sort(b + 1, b + m + 1);
for(int j = m; j >= 1, w != 0; j--, w--)
sum += b[j];
sum1 = max(sum, sum1);
}
cout << sum1 << endl;
return 0;
}