老题了,就是多了一个子数列的首尾元素,dp[i]=max(dp[i-1]+a[i],a[i]);需要改一下
if(dp[i-1]<0)dp[i]=a[i];x=y=i;
if(dp[i-1]>=0)dp[i]=dp[i-1]+a[i];y=i;
最后遍历注意一定是大于,否则j有可能不是最小的。
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int a[100005];
struct Dp{
int ans;
int x;
int y;
}dp[100005];
int max(int a, int b)
{
return a > b ? a : b;
}
int main()
{
int i, j, m, n, k, ans;
Dp temp;
while (scanf("%d", &k) != EOF)
{
if (!k)break;
for (i = 1; i <= k; i++)
scanf("%d", &a[i]);
dp[1].ans = a[1]; dp[1].x = 1; dp[1].y = 1;
for (i = 2; i <= k; i++)
{
if (a[i] > dp[i - 1].ans + a[i])
{
dp[i].ans = a[i]; dp[i].x = i; dp[i].y = i;
}
else
{
dp[i].ans = dp[i - 1].ans + a[i];
dp[i].x = dp[i - 1].x; dp[i].y = i;
}
}
temp = dp[1];
for (i = 2; i <= k; i++)
{
if (dp[i].ans > temp.ans)
temp = dp[i];
}
if (temp.ans > 0)
cout << temp.ans << " " << a[temp.x] << " " << a[temp.y] << endl;
else if (temp.ans == 0)
cout << "0 0 0" << endl;
else if (temp.ans < 0)
cout << "0 " << a[1] << " " << a[k] << endl;
}
return 0;
}