【算法小总结】最大连续子序列和最大连续子矩阵的关系与实现
2014-08-15 10:04
211 查看
最大连续子序列和最大连续子矩阵的关系与实现
求最长连续子序列的优化方法(非DP)
//求最大连续子序列和与对应的开头元素和结束元素
实现代码:
例子:
8
1 -3 -5 2 6 -1 4 9
20 2 9
类似的是,在矩阵中求最大子矩阵的方法可以转化成一维求最大连续子序列和的方法。
将矩阵的行或列压缩。这里我选择列压缩
如:
1 -1 2
4 9 15
-7 1 10
计算每一递进行的最长连续子序列和,什么是递进行?举个例子
全局变量MAX=-999999999
刚刚的矩阵
1 -1 2
4 9 15
-7 1 10
————————————————————————————————————
第一次记算取 1 -1 2
求出最长连续子序列是2,MAX=2
第二次取
1 -1 2
4 9 15
这里两行的每一列元素之和:5 8 17(从这里开始就体现矩阵压缩了)
求出最长连续子序列是30,MAX=30
第三次取
1 -1 2
4 9 15
-7 1 10
这里三行的每一列元素之和:-2 9 27
求出最长连续子序列是36,MAX=36
————————————————————————————————————
第四次取:4 9 15
求出最长连续子序列是28,MAX=36
第五次取
4 9 15
-7 1 10
这里两行的每一列元素之和:-3 10 25
求出最长连续子序列是35,MAX=36
————————————————————————————————————
第六次次取:-7 1 10
求出最长连续子序列是11,MAX=36
————————————————————————————————————
到此为止,所有可能的子矩阵和全都计算完毕,得出最大的子矩阵元素之和为36
即是
-1 2
9 15
1 10
这个子矩阵
实现代码:
刚刚的例子答案:
3
1 -1 2
4 9 15
-7 1 10
36
验证方法无误~
欢迎访问程序员之洞http://blog.csdn.net/acmman/
求最长连续子序列的优化方法(非DP)
//求最大连续子序列和与对应的开头元素和结束元素
实现代码:
#include<stdio.h> #include<string.h> #include<algorithm> #include<limits.h> #define MAXN 100002 using namespace std; int main() { int i,j,n,a[MAXN],Max,sum,max; int ps,pe,ts,te;//记录开头元素和结束元素 scanf("%d",&n); for(i=0;i<n;i++) scanf("%d",&a[i]); sum=0; Max=INT_MIN; for(i=0;i<n;i++) { if(sum<=0)//如果序列和为负数,初始化sum与开始结束下标 { sum=a[i]; ts=i; te=i; } else//如果序列和为正数,继续累加,并记录新的结尾坐标 { sum+=a[i]; te=i; } if(sum>Max)//一旦发现更大的连续子序列,就更新最大值和开始结束下标 { Max=sum; ps=ts; pe=te; } } printf("%d %d %d\n",Max,a[ps],a[pe]); return 0; }
例子:
8
1 -3 -5 2 6 -1 4 9
20 2 9
类似的是,在矩阵中求最大子矩阵的方法可以转化成一维求最大连续子序列和的方法。
将矩阵的行或列压缩。这里我选择列压缩
如:
1 -1 2
4 9 15
-7 1 10
计算每一递进行的最长连续子序列和,什么是递进行?举个例子
全局变量MAX=-999999999
刚刚的矩阵
1 -1 2
4 9 15
-7 1 10
————————————————————————————————————
第一次记算取 1 -1 2
求出最长连续子序列是2,MAX=2
第二次取
1 -1 2
4 9 15
这里两行的每一列元素之和:5 8 17(从这里开始就体现矩阵压缩了)
求出最长连续子序列是30,MAX=30
第三次取
1 -1 2
4 9 15
-7 1 10
这里三行的每一列元素之和:-2 9 27
求出最长连续子序列是36,MAX=36
————————————————————————————————————
第四次取:4 9 15
求出最长连续子序列是28,MAX=36
第五次取
4 9 15
-7 1 10
这里两行的每一列元素之和:-3 10 25
求出最长连续子序列是35,MAX=36
————————————————————————————————————
第六次次取:-7 1 10
求出最长连续子序列是11,MAX=36
————————————————————————————————————
到此为止,所有可能的子矩阵和全都计算完毕,得出最大的子矩阵元素之和为36
即是
-1 2
9 15
1 10
这个子矩阵
实现代码:
#include <stdio.h> #include <string.h> #include <limits.h> #define MAXN 10002 int a[MAXN][MAXN],temp[MAXN]; int n; int getsum() { int i,sum=0,max=0; for(i=0;i<n;i++) { sum+=temp[i]; if(sum>max) max=sum; if(sum<0) sum=0; } return max; } int main() { int i,j,ans,k; while(scanf("%d",&n)!=EOF) { memset(a,0,sizeof(a)); for(i=0;i<n;i++) for(j=0;j<n;j++) scanf("%d",&a[i][j]); ans=INT_MIN; for(i=0;i<n;i++)//从第i行开始 { memset(temp,0,sizeof(temp)); for(j=i;j<n;j++)//从 i行到 n-1行都尝试一次 { for(k=0;k<n;k++)//把 j至 k行的每一列都加起来,就是矩阵压缩 temp[k]+=a[j][k]; int pre=getsum();//计算压缩矩阵形成的一维数组的最长连续序列 if(ans<pre)//更新最大值 ans=pre; } } printf("%d\n",ans); } return 0; }
刚刚的例子答案:
3
1 -1 2
4 9 15
-7 1 10
36
验证方法无误~
欢迎访问程序员之洞http://blog.csdn.net/acmman/
相关文章推荐
- 最大连续子序列和最大连续子矩阵的关系与实现
- 【实现】最大连续子序列和——第7周《算法》课程提到的 google笔试题/浙大研究生复试机试题
- 学习笔记——c语言实现最大连续子序列之和的算法
- 连续子序列最大和的各种算法
- 求最大连续子序列之和的平方算法[c#数据结构]
- 最大子序列的算法实现
- 最大子序列算法的JAVA实现
- 《github一天一道算法题》:分治法求数组最大连续子序列和
- 求所有最大公共子序列的算法实现
- 最大子序列算法的JAVA实现
- 求所有最大公共子序列的算法实现
- 求所有最大公共子序列的算法实现
- 求所有最大公共子序列的算法实现
- 算法学习之最大子序列算法(java实现)
- Java实现O(n)最大连续子序列和
- 求一个向量的任何连续子向量的最大和的4种算法实现(简单实例)
- 算法线性编程珠玑读书笔记之----->使用线性算法求解连续子序列的最大和
- java实现最大子序列问题——————性能最优的算法
- 【算法数据结构Java实现】时间复杂度为O(n)的最大和序列
- 总结java最大连续子序列和的问题