HDU--1231 : 最大连续子序列 (DP求连续子序列最大和)
2014-08-28 21:00
274 查看
1. 题目源地址:http://acm.hdu.edu.cn/showproblem.php?pid=1231
2. 动态规划方程:
状态:f[i]:以i为结尾最长连续序列
2. 动态规划方程:
状态:f[i]:以i为结尾最长连续序列
状态转移:f[i]=max{f[i-1]+a[i],a[i]} 初始状态:f[1]=a[i] 要求最大的,只需从f[]找出最大值就行了3.源代码:#include<iostream> using namespace std; int main() { int N,i,j,pos; int num[10010],dp[10010]; int start[10010];//用于记录序列的开始元素 while(cin>>N && N) { for(i=0;i<N;i++) cin>>num[i]; int flag=1; //如果全为负数,输出0以及第一个和最后一个元素 for(i=0;i<N;i++) { if(num[i]>=0) { flag=0; break; } } if(flag) { cout<<0<<" "<<num[0]<<" "<<num[N-1]<<endl; continue; } dp[0]=num[0]; start[0]=0; for(i=1;i<N;i++) { if(dp[i-1]+num[i]>=num[i])//若符合动态规划方程。注意:这里是大于等于! { dp[i]=dp[i-1]+num[i]; start[i]=start[i-1];//序列开始元素的值不变 } else { dp[i]=num[i]; start[i]=i;//序列开始元素的值改变 } } int max=-1;//注意:这里max注意取值 for(i=0;i<N;i++) { if(dp[i]>max) { max=dp[i]; pos=i;//start[pos]中记录了该序列的开始位置,pos为序列的结束 } } cout<<max<<" "<<num[start[pos]]<<" "<<num[pos]<<endl; } return 0; }
相关文章推荐
- Hdu 1231 最大连续子序列(DP)
- 杭电hdu 1231 最大连续子序列 dp
- HDU 1231 最大连续子序列 (线性dp)
- hdu 1231 最大连续子序列 DP
- HDU-1231-最大连续子序列【dp】
- HDU 1231——最大连续子序列(DP)
- hdu 1231 最大连续子序列(dp)
- hdu 1231 最大连续子序列 (dp)
- hdu 1231 最大连续子序列(dp)
- hdu 1231最大连续子序列 【DP】
- HDU 1003 Max Sum && HDU 1231 最大连续子序列 (DP)
- HDU 1231 最大连续子序列 (dp)
- hdu 1231 最大连续子序列(DP)
- HDU 1231 最大连续子序列( DP做法 + 水题做法)
- HDU 1231 最大连续子序列 DP题解
- hdu 1231 最大连续子序列(DP)
- HDU 1231 最大连续子序列 (DP)
- 最大连续子序列和(经典DP) 之 hdu 1231 最大连续子序列
- 最大连续子序列(HDU_1231) 基础DP
- HDU 1231:最大连续子序列(DP)