poj 1050 最大子数组和 最大子段和
此题求一个最大子数组的和,可以将子数组转化成最大子段和
解析: 设一个数组dp[1...n]来保存每一列的数值,i - > 1 -n 每次从i到n计算dp[i]的值,再对本行进行最大子段求和
#include<iostream> #include<cstring> using namespace std; const int MAXN = 100; const int INF = 0x3fffff; int map[MAXN+1][MAXN+1],dp[MAXN+1]; int main() { int n; cin>>n; for(int i = 0;i<n;i++) for(int j = 0;j<n;j++) cin>>map[i][j]; int max = -INF,sum; for(int i = 0;i<n;i++) { memset(dp,0,sizeof(dp)); for(int j = i;j<n;j++) { sum = -INF; for(int k = 0;k<n;k++) { dp[k] += map[j][k]; if(sum < 0) sum = dp[k]; else sum += dp[k]; if(sum > max) max = sum; } } } cout<<max<<endl; }