最长连续和与最大子矩阵
2013-12-24 01:51
211 查看
1. 最长连续和
求一个串里面最长连续的子串
如:
1 2 3 -4 5 -10
最长是 1 2 3 -4 5 和7 长度5 起始1~5
算法:
这应该是一个很简单的问题, 倒是本人想复杂了, 耗时不少呀~
不说, 贴代码, 主要是sum的作用, 细细体会:
2. 最大子矩阵
和上面类似, 只是换成了二维
矩阵压缩, 把第I到第N行压缩到一行上
hdu1003 hdu1081
求一个串里面最长连续的子串
如:
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
相关文章推荐
- 最长连续和与最大子矩阵
- 动态规划——最长连续子序列和+最大子矩阵和
- 动态规划-最长连续子序列和与最大子矩阵
- 最大子矩阵【最大连续子串和的衍生】
- [ACM_动态规划] POJ 1050 To the Max ( 动态规划 二维 最大连续和 最大子矩阵)
- 任意区间的最长连续递增子序列,最大连续子序列和
- POJ1050与最大连续子段和,最大子矩阵问题
- 最大子序列、最长连续公共子串(连续)、最长公共子序列(动态规划)
- 利用动态规划求连续数组最大和以及最大子矩阵的和
- 利用动态规划求连续数组最大和以及最大子矩阵的和
- 寻找最大连续子串和以及寻找最长数字串
- 计算两个字符串的最大公共字串的长度,字符不区分大小写(要求计算连续最长字串的长度)
- 用三重循环求一个字符串的最大回文串(连续重复出现的最长子串)
- 最长和为零的子数组与最大子矩阵
- 最大子串和,最长连续子串,最长子序列(不连续)
- 最长回文串(可不连续)与最大公共子串(可不连续)
- 美团2017编程题—拼凑钱币&大富翁游戏&最大矩形面积&最长公共连续子串
- HDU 1422重温世界杯 (环形)最长连续子段 由最大连续子段和变形的到
- 小结:最大连续和,最大子矩阵和--附上hdu1003、poj1050=hdu1081解题报告
- POJ 1050 To the Max【求最大的子矩阵和同上一篇数组中最大连续和】