1. 程式人生 > >[pat]1007 Maximum Subsequence Sum

[pat]1007 Maximum Subsequence Sum

CA 應該 else if mes its 結果 printf AI include

經典最大連續子序列,dp[0]=a[0],狀態轉移dp[i]=max(dp[i-1]+a[i],a[i])找到最大的dp[i].

難點在於記錄起點,這裏同樣利用動態規劃s[i],如果dp[i]選擇的是dp[i-1]+a[i]那麽s[i]=s[i-1]dp[i]與dp[i-1]存在共同的起點,如果的dp[i]選擇的是a[i],那就說明他是以a[i]為起點的新序列。s[i]=a[i].一開始想從終點一直向前遍歷找到a[i]<0的下一個就是起點,有一個點無法通過24分,後來才發現這是一種極為智障的想法。比如1000 2000 -1 100 200這個序列,結果為3299 100 200,顯然起點應該是1000才對。

#include <bits/stdc++.h>
using
namespace std; int a[10005]; int main() { int k; scanf("%d", &k); int i; for (i = 0; i < k; i++) { scanf("%d", &a[i]); } vector<int>dp(k + 1, -1); vector<int>s(k + 1, 0); dp[0] = a[0]; for (i = 1; i < k; i++) { dp[i] = max(dp[i - 1
] + a[i], a[i]); if (dp[i] == dp[i - 1] + a[i]) s[i] = s[i - 1]; else s[i] = i; } int start, end; int max = dp[0]; int j = 0; for (i = 1; i < k; i++) { if (dp[i] > max) { max = dp[i]; j = i; } }
bool flag = false; for (i = 0; i < k; i++) { if (a[i] > 0) flag = true; } if (max >= 0) { /*end = j; for (; j >= 0; j--) { if (a[j] < 0) break; } if (j == -1) { j = 0; } else if (j >= 0 && a[j] < 0) { j = j + 1; } start = j;*/ printf("%d %d %d\n", max, a[s[j]], a[j]); } else if (flag == false) { printf("0 %d %d\n", a[0], a[k - 1]); } }

[pat]1007 Maximum Subsequence Sum