这道题目标是解决最大连续子序列和的问题,属于动态规划中的经典问题,但又有所变形
增加了要求:即求解出最大连续子列和的开始首项和末项的位置。
但其核心思想没有变化,仍然沿用dp[i]=max{a[i],dp[i-1]+a[i]}这一状态转移方程,其中dp[i]是以第i个元素结尾的最大连续子序列和,a[i]为第i个元素的大小。
这是我第一次wa的代码
// ConsoleApplication68.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<stdio.h>
#include<algorithm>
int a[100000], dp[100000];
using namespace std;
int main()
{
int n;
while (scanf("%d", &n) != EOF)
{
int num = 1;
while (n--)
{
int len;
scanf("%d", &len);
for (int i = 1;i <= len;i++)
{
scanf("%d", &a[i]);
}
dp[1] = a[1];
for (int i = 2;i <= len;i++) { dp[i] = max(dp[i-1]+a[i],a[i]); }
int k = 1;
for (int i = 2;i <= len;i++)
{
if (dp[i] > dp[k])k = i;
}
int head, tail = k;
if (dp[k] == a[k]) head = k;
else {
int mark = k;
while (dp[mark] != a[mark]) {
mark--;
}
head = mark;
}
printf("case %d:\n", num);num++;
printf("%d %d %d\n\n", dp[k], head, tail);
}
}
return 0;
}
在检查后发现,就是在第二组样例(7 0 6 -1 1 -6 7 -5)中,他有一个现象就是,单独第六个拿出来的元素大小与前六个和相等,而我的找头,尾位置中的头的查找方法是利用dp[i]与a[i]的相等与否来完成,所以有所欠缺(错误就出现于此)。(可见这个方法适用于大部分的情况,少考虑了这种特殊情况)头尾的找法,最好是与找最大序列和同时进行,虽然方便,但反而给后面增加了麻烦,所以还是要根据实际情况来使用库!
下面是参考了这个这位博主的博客,最终完成了,思路也非常清楚,很棒!