当前位置: 代码迷 >> 综合 >> NYOJ - 最大和(DP)
  详细解决方案

NYOJ - 最大和(DP)

热度:42   发布时间:2024-01-20 18:03:39.0

最大和

时间限制: 1000 ms  |           内存限制: 65535 KB
难度: 5
描述

给定一个由整数组成二维矩阵(r*c),现在需要找出它的一个子矩阵,使得这个子矩阵内的所有元素之和最大,并把这个子矩阵称为最大子矩阵。
例子:
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
其最大子矩阵为:

9 2
-4 1
-1 8
其元素总和为15。

输入
第一行输入一个整数n(0<n<=100),表示有n组测试数据;
每组测试数据:
第一行有两个的整数r,c(0<r,c<=100),r、c分别代表矩阵的行和列;
随后有r行,每行有c个整数;
输出
输出矩阵的最大子矩阵的元素之和。
样例输入
1
4 4
0 -2 -7 0 
9 2 -6 2 
-4 1 -4 1 
-1 8 0 -2 
样例输出
15
#include <stdio.h>
#include <string.h> int ans[101][101];
int dp[101];int max_sum(int n)
{int i,s = 0,max = dp[0];for(i = 0; i < n; i++){if(s > 0)s += dp[i];elses = dp[i];if(s > max)max = s;}return max;
}
int main(void)
{int n,r,c,i,j,k,max,s;scanf("%d",&n);while(n--){scanf("%d%d",&r,&c);for(i = 0; i < r; i++){for(j = 0; j < c; j++){scanf("%d",&ans[i][j]);}}max = -100000000;for(i = 0; i < r; i++){memset(dp,0,sizeof(dp));for(j = i; j < r; j++){for(k = 0; k < c; k++){dp[k] += ans[j][k];}s = max_sum(k);if(max < s)max = s;}}printf("%d\n",max);}return 0;
}

这个也是经典的DP问题,因为,这个题目可以转化为求出一组序列的连续子串最大和问题,如何求出矩阵中最大和子矩阵,我们这里可以将二维的矩阵压缩成一维,当矩阵被压缩成一维之后,那么,这个问题就转化为连续子串最大和问题,所以,这个问题也就解决了。这题已经AC,这里提供参考。

  相关解决方案