hdu1003求最大子序列
来源:互联网 发布:定量和定性数据 编辑:程序博客网 时间:2024/05/16 05:33
分析:定义数组present[MAX]代表前i个数且包括第i个数的子序列的最大和,prior[MAX]表示前i个数最大子序列的和
所以有:present[i]=max(present[i-1]+s[i],s[i]);//前i-1个数包括第i-1个数的子序列最大和加上当前这个数构成的子序列,或者以当前这个数自成一个子序列,两者中选最大的。
prior[i]=max(present[i],prior[i-1]);//前i个数的最大子序列和为:前i-1个数的最大子序列和或者前i个数且包括第i个数的最大子序列和。
继续分析发现每次求前i个最大子序列和都用不到0.....i-2的值,所以可以用滚动数组的思想节省内存
也就是:present=max(present+s[i],s[i]),prior=max(present,prior);每次计算前i个数时,present,prior就已经是前i-1的最大值,所以不需要present[i-1],prior[i-1];
对于输入的数s[i]也是每次都只需要用到s[i],对于s[0....i-1]不需要用到,所以在输入的时候计算就不需要用到s数组了。
此题还要记录选的子序列的第一个和最后一个,所以加个first,last辅助变量。
最终代码如下:
#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<string>#include<queue>#include<algorithm>#include<map>#include<iomanip>#define INF 99999999using namespace std;const int MAX=100001;int present,prior,s,first,last,temp;int main(){int t,n,num=1;cin>>t;while(t--){cin>>n; present=prior=-INF;for(int i=1;i<=n;++i){cin>>s;present+=s;if(s>present){present=s;temp=i;}//present=max(present+s,s)if(present>prior){prior=present;first=temp;last=i;}//prior=max(prior,present);}cout<<"Case "<<num++<<":\n";cout<<prior<<" "<<first<<" "<<last<<endl;if(t)cout<<endl;}return 0;}
- hdu1003求最大子序列
- hdu1003求最大和子序列
- hdu1003最大子序列和
- hdu1003 最大连续子序列
- HDU1003--最大连续子序列
- HDU1003-最大子序列和
- HDU1003 最大子序列和问题
- HDU1003 ---最大子序列和 subsequence
- hdu1003 最大连续子序列和
- hdu1003 Max Sum 最大连续子序列
- HDU1003(最大连续子序列和DP)
- hdu1003 最大子序列的和
- HDU1003 动态规划,最大子序列之和
- HDU1003(最大连续子序列)
- HDU1003最大连续子序列和
- 求最大子序列
- 求最大子序列
- 求最大子序列
- C#中使用DirectSound录音
- 写给毕业生
- 关于403异常的信息
- JS 元素位置 取得位置
- 利用ffmpeg和SDL实现一个跨android版本的音视频播放器
- hdu1003求最大子序列
- 如何用js把字符串转化为整型
- svm
- 从测试到QA
- solr中大小写问题
- apache站点日志设置总结
- android之点击事件ImageView切换
- 2013.01.11 ORA-SQL 测试脚本
- 家庭监控预警 犯罪无所遁形