动态规划 1235: 最大连续子序列

#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
int n;
while(scanf("%d",&n)&&n)
{
int arry[n],dp[n];
for(int i=0; i<n; i++)
scanf("%d",&arry[i]);
dp[0]=arry[0];
int max1=arry[0],end1=0,start=0,start1=0;
for(int i=1; i<n; i++)
{
dp[i]=max(dp[i-1]+arry[i],arry[i]);//动态转移方程
if( dp[i-1]+arry[i]<arry[i])start=i;//如果当前子序列的和小于当前值时更新起点位置不能用(dp[i]==arry[i])可能会有dp[i-1]+arry[i]==arry[i]的情况
if(max1<dp[i])
{
max1=dp[i];//获取最大的子序列和
end1=i;//更新末尾位置
start1=start;//更新起点位置!!!!注意这点,此时也要更新否则错误
}
}
if(max1>=0)
printf("%d %d %d\n",max1,arry[start1],arry[end1]);
else printf("0 %d %d\n", arry[0],arry[n-1]);
}
return 0;
}

posted @ 2015-10-29 10:32  -梦里不知身是客  阅读(249)  评论(0编辑  收藏  举报