1. 最长连续和
求一个串里面最长连续的子串
如:
1 2 3 -4 5 -10
最长是 1 2 3 -4 5 和7 长度5 起始1~5
算法:
这应该是一个很简单的问题, 倒是本人想复杂了, 耗时不少呀~
不说, 贴代码, 主要是sum的作用, 细细体会:
for(i=0;i<N;i++) scanf("%d",&a[i]); int x = 1,y = 1; int flag = 1; int sum = 0; int ans = -INF; for(int i = 1;i <= N;i ++) { sum += a[i]; if(sum > ans) { ans = sum; x = flag; y = i; } if(sum < 0)//这里 不能是else 要考虑所有数为负数 { sum = 0;flag = i+1; } }
2. 最大子矩阵
和上面类似, 只是换成了二维
矩阵压缩, 把第I到第N行压缩到一行上
int temp[MAX],map[MAX][MAX]; int getsum() { int sum = 0,max = -INF; for(int i = 1;i <= M; i ++) { sum += temp[i]; if(sum > max) max = sum; if(sum < 0) sum = 0; } return max; } int main() { for(int i = 1;i <= N; i ++) for(int j = 1;j <= M; j ++) scanf("%d",&map[i][j]); int ans = -INF; for(int i = 1; i <= N; i ++)//从第i行开始 { memset(temp,0,sizeof(temp)); for(int j = i; j <= N; j ++)//从i行到N行都尝试叠加上去 { for(int k = 1; k <= M; k ++)//把i到j行的每一列加起来。。。就是矩阵压缩 temp[k] += map[j][k]; int pre = getsum();//计算压缩的一维连续区间最大和 if(ans < pre) ans = pre; } } return 0; }
hdu1003 hdu1081