最大子段和算法
来源:互联网 发布:linux如何删vi除第一行 编辑:程序博客网 时间:2024/05/14 10:48
整理备忘
#include <iostream>using namespace std;//使用分治算法int maxSubSum(int* a,int left,int right){ int sum=0; if(left==right) { sum=a[left]>0 ? a[left]:0; } else { int center=(left+right)/2; int leftSum=maxSubSum(a,left,center); int rightSum=maxSubSum(a,center+1,right); int s1=0; int lefts=0; for(int i=center; i>=left; i--) { lefts+=a[i]; if(lefts>s1) { s1=lefts; } } int s2=0; int rights=0; for(int i=center+1; i<=right; i++) { rights+=a[i]; if(rights>s2) { s2=rights; } } sum=s1+s2; if(sum<leftSum) sum=leftSum; if(sum<rightSum) sum=rightSum; } return sum;}int main(){ int a[10]= {-1,2,3,-3,4,5,-7,8}; int start=0,end=7; int b=maxSubSum(a,start,end); return b;}
动态规划:
#include <iostream>using namespace std;//使用动态规划int maxSum(int *a,int n,int &start,int &end){ int b=0,sum=a[0]; int temStart=0; for(int i=0; i<=n; i++) { if(b>=0) { b+=a[i]; } else { b=a[i]; temStart=i; } if(b>sum) { sum=b; start=temStart; end=i; } } return sum;}int main(){ int number; cin>>number; for(int i=1; i<=number; i++) { int k; cin>>k; int *a=new int[k]; int start=0,end=0; for(int j=0; j<k; j++) { cin>>a[j]; } int b=maxSum(a,k-1,start,end); cout<<"Case "<<i<<":"<<endl; cout<<b<<" "<<++start<<" "<<++end<<endl; if(i!=number) cout<<endl; delete a; } return 0;}
- 最大子段和算法
- 最大子段和算法
- 【算法设计】最大子段和问题
- 最大子段和 各种算法讨论
- 最大子段和几种算法
- 【经典算法】 最大子段和
- 【算法】最大子段和问题
- [算法]最大子段和问题
- 最大子段和
- 最大子段和
- 最大子段和
- 最大子段和
- “最大子段和”
- 最大子段和
- 最大子段和
- 最大子段和
- 最大子段和
- 最大子段和
- 从脚印看UGC社区在国内发展挑战
- 存储过程开发的具体步骤
- hdu4221
- zoj1003-Crashing Balloon
- 单独下载windbg(Debugging Tools for Windows)工具
- 最大子段和算法
- HTML的form中runat的作用
- 按钮图片的设置 .
- TOMCAT配置数据源
- tomcat配置项目
- 自定义标签
- JSP进一步学习3
- 常用的配置文件-SSH-3
- svn配置库插件的使用