dp问题中的最大连续子序列和,本题要求记录最大序列和的首尾元素。
坑点如下
1,dp的方法
const int maxk=10010;
int d[maxk];//存储输入元素
int dp[maxk];//存储i结尾的最大子序列和
2,首尾元素的计算方法
创建首元素数组,记录对应元素。
if(d[i]>dp[i-1]+d[i]){
s[i]=i;//首元素为当前元素
}
else
{
s[i]=s[i-1];//首元素为上一元素为尾的序列的首元素。
}
整体代码如下
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxk=10010;
int d[maxk];
int dp[maxk];
int s[maxk];
int k;
int main()
{
scanf("%d",&k);
for(int i=1;i<=k;i++){
scanf("%d",&d[i]);
}
dp[1]=d[1];
s[1]=1;
for(int i=2;i<=k;i++){
dp[i]=max(d[i],dp[i-1]+d[i]);
if(d[i]>dp[i-1]+d[i]){
s[i]=i;
}
else
{
s[i]=s[i-1];
}
}
int j=1;
for(int i=2;i<=k;i++){
if(dp[i]>dp[j]){j=i;}
}
if(dp[j]<0)
{
printf("0 %d %d\n",d[1],d[k]);
return 0;
}
else
{
printf("%d %d %d",dp[j],d[s[j]],d[j]);
}
}