最大子矩阵
文章目录
链接:https://ac.nowcoder.com/acm/contest/24213/1044
题目描述
这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大。
注意:选出的k个子矩阵 不能相互重叠。
输入描述:
第一行为n,m,k(1 ≤ n ≤ 100,1 ≤ m ≤ 2,1 ≤ k ≤ 10),
接下来n行描述矩阵每行中的每个元素的分值(每个元素的分值的绝对值不超过32767)。
输出描述:
只有一行为k个子矩阵分值之和最大为多少。
示例1
输入
3 2 2
1 -3
2 3
-2 3
输出
9
AC代码
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 10;
int a[110][110];
int dp[110][110][20];
int s[110][3]; //前缀和
int main(){
int n, m, t;
cin >> n >> m >> t;
for (int i = 1; i <= n;i ++)
for (int j = 1; j <= m;j ++){
cin >> a[i][j];
s[i][j] = s[i - 1][j] + a[i][j];
}
for (int i = 1; i <= n;i ++){
for (int j = 1; j <= n;j ++){
for (int k = 1; k <= t;k ++){
dp[i][j][k] = max(dp[i - 1][j][k], dp[i][j - 1][k]);
for (int p = 0; p < i;p ++)
dp[i][j][k] = max(dp[i][j][k], dp[p][j][k - 1] + s[i][1] - s[p][1]);
for(int p=0;p<j;p++)
dp[i][j][k]=max(dp[i][j][k],dp[i][p][k-1]+s[j][2]-s[p][2]);
if(i==j)
for(int p=0;p<i;p++)
dp[i][j][k]=max(dp[i][j][k],dp[p][p][k-1]+s[i][1]+s[j][2]-s[p][1]-s[p][2]);
}
}
}
cout<<dp[n][n][t];
return 0;
}