POJ 1050 (DP)
题目:http://poj.org/problem?id=1050
这个题的基础是最大字段和。
我以前写过最大字段和,如下:
最大字段和:http://www.cnblogs.com/HpuAcmer/archive/2011/11/27/2264856.html
最大子矩阵和的方法和最大字段和一样,转化下就是最大字段和。
思路:
先单独对每行求最大字段和(此时,子矩阵的行为1,就是最大字段和了)
然后,把第i行后的各行对应列的元素加到第i行的对应列元素,每加一行,就求一次最大字段和,这样就把子矩阵的多行压缩为一行了,一行了就是最大字段和了啊!
代码:
#include <stdio.h> #include <stdlib.h> int m[101][101]; int main() { int n,max,i,j,k,tmp; while( scanf("%d",&n) != EOF) { max = -10000; /* 输入时,顺便求出各行的最大字段和的最大值 */ for(i = 0 ; i < n ; ++i) { tmp = 0 ; for(j = 0 ; j < n ; ++j) { scanf("%d",&m[i][j]); if(tmp > 0) tmp += m[i][j]; else tmp = m[i][j]; if(tmp > max) max = tmp; } } for(i = 0 ; i < n-1 ; ++i) { for(j = i+1 ; j < n ; ++j) { tmp = 0; for(k = 0 ; k < n ; ++k) { m[i][k] += m[j][k];//相当于把子矩阵多行压缩为一行了 if(tmp > 0) tmp += m[i][k]; else tmp = m[i][k]; if(tmp > max) max = tmp; } } } printf("%d\n",max); } // system("pause"); return 0; }