我的dp思路是
记b[j]表示到到j位,最大最长的子序列的和
则可得状态转移方程b[j]=max(b[j-1]+a[j],a[j]);
因为每个数都有两种状态,要么和前面相连,要么自己相连;
让后再比较出来最大值;
一下是我的代码
#include<stdio.h>
#include<stdlib.h>
#include<stdlib.h>
#include<math.h>
#include<iostream>
#include<algorithm>
using namespace std;
const int sizen=110000;
int T;
int n;
int i;
int k;
int b[sizen];
int from,to;
int sum;
int be,st;
int cnt=0;
bool flag=false;
int main()
{
scanf("%d",&T);
while(T--)
{
from=1;
to=1;
sum=-99999999;
b[0]=0;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&k);
if(b[i-1]+k>=k)
b[i]=b[i-1]+k;
else
{
from=i;
b[i]=k;
}
if(sum<b[i])
{
sum=b[i];
be=from;
st=i;
}
}
if(!flag)
flag=true;
else
printf("\n");
printf("Case %d:\n",++cnt);
printf("%d %d %d\n",sum,be,st);
}
return 0;
}
标签:hdu,int,sum,sizen,include,1003,scanf,dp
From: https://blog.51cto.com/u_16234093/7199347