NYOJ - 最大和(DP)

来源:互联网 发布:淘宝棉麻女装 编辑:程序博客网 时间:2024/05/16 07:47

最大和

时间限制: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个整数;
输出
输出矩阵的最大子矩阵的元素之和。
样例输入
14 40 -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,这里提供参考。