1084: [SCOI2005]最大子矩阵
2017-07-25 20:00
134 查看
Description
这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大。注意:选出的k个子矩阵不能相互重叠。
Input
第一行为n,m,k(1≤n≤100,1≤m≤2,1≤k≤10),接下来n行描述矩阵每行中的每个元素的分值(每个元素的分值的绝对值不超过32767)。
Output
只有一行为k个子矩阵分值之和最大为多少。Sample Input
3 2 21 -3
2 3
-2 3
Sample Output
9m只有1或二所以可以分类讨论,m为1时 dp[i][j]表示到第i位k个子矩阵的最大值。
m为2时dp[i][j][k]表示第一列到第i个且第二列到第j个k个子矩阵的最大值。然后转移即可。
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; const int maxm = 105; int dp[maxm][maxm][15], f[maxm][15], s[3][maxm]; int main() { int n, i, j, k, sum, m, p, r, h; scanf("%d%d%d", &n, &m, &p); for (i = 1;i <= n;i++) { for (j = 1;j <= m;j++) { scanf("%d", &k); s[j][i] = s[j][i - 1] + k; } } if (m == 1) { for (i = 1;i <= n;i++) { for (j = 1;j <= p;j++) { f[i][j] = f[i - 1][j]; for (k = 0;k < i;k++) f[i][j] = max(f[i][j], f[k][j - 1] + s[1][i] - s[1][k]); } } printf("%d\n", f [p]); return 0; } for (i = 1;i <= n;i++) { for (j = 1;j <= n;j++) { for (k = 1;k <= p;k++) { dp[i][j][k] = max(dp[i - 1][j][k], dp[i][j - 1][k]); for (r = 0;r < i;r++) dp[i][j][k] = max(dp[i][j][k], dp[r][j][k - 1] + s[1][i] - s[1][r]); for (r = 0;r < j;r++) dp[i][j][k] = max(dp[i][j][k], dp[i][r][k - 1] + s[2][j] - s[2][r]); if (i == j) { for (r = 0;r < i;r++) dp[i][j][k] = max(dp[i][j][k], dp[r][r][k - 1] + s[1][i] - s[1][r] + s[2][i] - s[2][r]); } } } } printf("%d\n", dp [p]); return 0; }
相关文章推荐
- 【BZOJ1084 || SCOI2005】最大子矩阵
- BZOJ 1084: [SCOI2005]最大子矩阵
- [DP] bzoj1084: [SCOI2005]最大子矩阵
- 1084: [SCOI2005]最大子矩阵
- [bzoj 1084--SCOI2005]最大子矩阵
- BZOJ1084: [SCOI2005]最大子矩阵
- bzoj 1084: [SCOI2005]最大子矩阵
- bzoj1084【SCOI2005】最大子矩阵
- BZOJ1084: [SCOI2005]最大子矩阵
- 【BZOJ 1084】[SCOI2005]最大子矩阵
- [SCOI2005][BZOJ1084] 最大子矩阵
- bzoj1084[SCOI2005]最大子矩阵
- BZOJ_1084_[SCOI2005]_最大子矩阵_(动态规划)
- 1084: [SCOI2005]最大子矩阵 (动态规划)
- BZOJ1084: [SCOI2005]最大子矩阵
- 【bzoj1084】 [SCOI2005]最大子矩阵
- bzoj1084: [SCOI2005]最大子矩阵
- bzoj 1084;vijos 1191 [SCOI2005] 最大子矩阵
- 【BZOJ】1084: [SCOI2005]最大子矩阵(DP)
- 1084: [SCOI2005]最大子矩阵