动态规划回顾(1):最大连续子序列和
2016-03-29 16:43
477 查看
最大连续子序列和问题
列出了两种解决连续子序列和问题的方法:线性搜索方法和动态规划方法/* 回顾经典的动态规划问题 1、最大子序列和问题 author:yangsen time:2016年3月29日 */ #include <iostream> #include<cstdio> #include<algorithm> using namespace std; //一种线性搜索法,只需要一遍扫描即可 //最大子序列和的子序列不可能以负数或者0开头! //子序列是连续的 int maxSub1(int a[],int n) { int i,tempSum=0,Maxsum=a[0]; for(i=0;i<n;++i) { tempSum+=a[i]; if(tempSum>Maxsum) Maxsum=tempSum; else if(tempSum<0) tempSum=0; } return Maxsum; } //一种动态规划方法:空间换取时间,记录之前的计算结果 //令dp[i]表示以a[i]作为末尾的连续序列的最大和,a[i]必须作为连续序列的末尾 //dp[i]=max(dp[i-1]+a[i],a[i]) int maxSub2(int a[],int dp[],int n)//n为数组长度 { dp[0]=a[0];//边界 int i,k=0; for(i=0;i<n;++i) dp[i]=max(dp[i-1]+a[i],a[i]); for(i=1;i<n;++i) { if(dp[i]>dp[k]) k=i; } return dp[k];//返回最大子序列和 } //打印数组:注意最后一个数后面的空格处理 void printArray(int a[],int n) { for(int i=0;i<n;++i) { if(i==0) printf("%d",a[i]); else printf(" %d",a[i]); } } int main() { int i,maxn=10000; int a[]={-2,11,-4,13,-5,2,-5,-3,-9,17}; int n=sizeof(a)/sizeof(a[0]); int dp[maxn]; printArray(a,n); printf("\n"); cout<<"maxSub="<<maxSub1(a,n);//使用线性搜索法 cout<<endl; cout<<"maxSub="<<maxSub2(a,dp,n); //使用动态规划 return 0; }
相关文章推荐
- 面试题的那些事(2)—斐波那契数列
- VC中CTreeCtrl控件单击事件,如何判断是单击的是某项的按钮,还是单击的文字
- Remastersys---制作当前的ubuntu系统镜像iso,自定义ubuntu系统
- JDBC驱动自身问题引发的FullGC
- HITS算法详解及代码实现
- JAVA打印二维码图片自定义高度
- iOS开发-git版本控制
- PHP 两张图片合成一张图片(加水印)
- Navicat异地自动备份MySQL方法详解(图文)
- iOS 原生态扫描二维码、条形码的功能。
- Gulp实战
- Linux内核实验作业五
- I.MX6 build.prop
- JavaEE_Servlet的页面跳转 和 参数的传递
- 2016.03.29///Java学习记录③
- linux 配置nfs
- x & (x - 1)式子的含义
- 异常:Can't create handler inside thread that has not called Looper.prepare()
- 让你的Android项目更加整洁与清晰
- mpu9250摘抄笔记及心得