C - 最大连续子序列
这题感觉不像dp(动态规划),但还是把它归入动态规划来了。
题意中文,大家都能懂题目意思。
解题思路:
把前i-1个数加起来,如果它们的和大于等于0,那么是不是对后面的数值相加产生积极影响。反之,如果和小于0,因为我想要的是越大越好,若把前面的负值加上来,肯定会让我的值更小,所以前面这段就可以抛弃了,开始点就可以从i+1开始。
原则:
只要和 小于0,前面这段到i这点就抛弃,开始点和终点从i+1开始;
只要和 不小于0,则前面这段可以保留,终点直接等于i;
用三个变量来分别保存最大值,开始点,终点;每次运算都要与最大值进行判断。
AC代码:
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
using namespace std;
const int p = 10005;
int data[p],dp[p];
int main()
{
int N,i,j;
int max_sum, rea_sta, rea_end, tmp_sta, tmp_end;
while(scanf("%d",&N),N)
{
int mark = 0 ,temp;
dp[0]=0;
max_sum = -99999999;
for(i = 1;i <= N;i++)
{
scanf("%d",&data[i]);
if(data[i]>=0)
mark = 1;
}
tmp_sta = tmp_end = 1;
for(i = 1;i <= N;i++)
{
temp = dp[i-1]+data[i];
if(temp < 0)//all give up
{
dp[i] = 0;
tmp_sta = tmp_end = i+1;
}
else//
{
dp[i] = temp;
tmp_end = i;
}
if(temp > max_sum)
{
max_sum = temp;
rea_sta = tmp_sta;
rea_end = tmp_end;
}
}
if(mark)
printf("%d %d %d\n",max_sum,data[rea_sta],data[rea_end]);
else
{
printf("0 %d %d\n",data[1],data[N]);
}
}
return 0;
}