最长连续和与最大子矩阵
2013-12-24 01:51
281 查看
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
求一个串里面最长连续的子串
如:
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【求最大的子矩阵和同上一篇数组中最大连续和】