HDU 1003

来源:互联网 发布:网络作家村 编辑:程序博客网 时间:2024/06/07 04:06

题目大意:给出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;}
原创粉丝点击