题目大意:给出n个数,求出其中连续子序列和最大的为多少,这个子序列的头位置以及尾位置。
解题思路:很容易想到状态和状态转移的dp,dp[0]肯定等于输入的第一个数,后面的dp[i]根据前一个数是否大于0,如果大于0说明,此时可以加上前一个dp作为结果,否则直接用这个位置的数作为dp的值。后面去找就位置就简单了,要注意可能结果为负数的情况。
ac代码:
#include <iostream>
using namespace std;
int a[100005], n, m, cnt=1, Max, dp[100005];
int main()
{scanf("%d", &n);while (n--){scanf("%d", &m);for (int i=0; i<m; i++)scanf("%d", &a[i]);dp[0] = a[0];for (int i=1; i<m; i++)if (dp[i-1] < 0)dp[i] = a[i];elsedp[i] = dp[i-1] + a[i];Max = dp[0];for (int i=1; i<m; i++)if (dp[i] > Max)Max = dp[i];printf("Case %d:\n%d ", cnt++, Max);for (int i=0; i<m; i++)if (dp[i] == Max){Max = i;for (int j=i; dp[j]>=0 && j>=0; j--)Max = j;printf("%d ", Max+1);printf("%d\n", i+1);break;}if (n)printf("\n");}
return 0;
}