最大子段和 hdu 1003 max sum ACM的开始
2013-05-03 21:47
363 查看
这个题目的印象是比较深刻的,我的第一个动态规划题目,也是ACM的开始。最大字段和是比较经典的动归问题。求一个序列的最大子段和的关键点就在于判断一个元素的归属问题,dp[i]表示包含第i个元素的最大子段和的结果,对于元素a[i],如果dp[i-1]>0那么加上dp[i-1]是有好处的,反之dp[i-1]就是累赘。这个题目有一个很好地问法,就是问你这个子段的起始位置和结束位置。很简单,记录一下结束位置,然后根据你的动归转移方程和自己的思想就能得到这个序列的起始位置和结束位置。下面看代码。
#include<iostream> using namespace std; int a[100001],b[100001]; int main() { int T,i,k,max,n,j,e; cin>>T; for(i=1;i<=T;i++) { cin>>a[0]; for(k=1;k<=a[0];k++) cin>>a[k]; max=a[1]; b[1]=a[1]; j=1; for(n=2;n<=a[0];n++) { if(b[n-1]<0) b =a ; else b =b[n-1]+a ; if(b >max) { max=b ; j=n; } } if(max<0) cout<<"Case "<<i<<":"<<endl<<max<<" "<<j<<" "<<j<<endl; else { for(e=j-1;e>0;e--) if(b[e]<0) break; cout<<"Case "<<i<<":"<<endl<<max<<" "<<e+1<<" "<<j<<endl; } if(i<T) cout<<endl; } return 0; }
相关文章推荐
- 位置子段最大子段和 hdu 1003 max sum ACM的开始
- HDU 1024 Max Sum Plus Plus(动态规划,给定一个数组,求其分成m个不订交子段和最大值的题目)
- HDU 1024:Max Sum Plus Plus 经典动态规划之最大M子段和
- hdu Max Sum Plus Plus(动态规划+分段最大子段和)
- [ACM] hdu 1003 Max Sum(最大子段和模型)
- HDU 1024:Max Sum Plus Plus 经典动态规划之最大M子段和
- HDU - 1003 Max Sum O(n)求最大区间和 贪心
- Max Sum &&http://acm.hdu.edu.cn/showproblem.php?pid=1003
- HDU 1003 Max Sum && HDU 1231 最大连续子序列 (DP)
- HDU-1024 Max Sum Plus Plus (最大M子段和问题)
- hdu 1003 max sum #最大字段和
- hdu 1024 Max Sum Plus Plus (子段和最大问题)
- HDU 1024 Max Sum Plus Plus最大m子段和
- HDU Max Sum Plus Plus 最大m子段和
- HDU 1024 Max Sum Plus Plus(dp最大m子段和)
- Max Sum HDU - 1003 求最大和
- hdu 1024 Max Sum Plus Plus(dp && 最大m子段和)
- HDU 1024 Max Sum Plus Plus[dp](最大m子段和)
- hdu 1024 Max Sum Plus Plus (子段和最大问题)
- HDU 1024 Max Sum Plus Plus[dp](最大m子段和)