您的位置:首页 > 其它

HDU--1231 : 最大连续子序列 (DP求连续子序列最大和)

2014-08-28 21:00 274 查看
1. 题目源地址:http://acm.hdu.edu.cn/showproblem.php?pid=1231

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;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: