题目:https://www.luogu.org/problemnew/show/P1115
题意:
求给定数组的最大区间和。
思路:
$dp[i][0]$表示以1~i的数组,不选i的最大字段和。$dp[i][1]$表示1~i的数组,选了i 的最大字段和。
显然有 $dp[i+1][0] = max(dp[i][0], dp[i][1])$和$dp[i+1][1] = max(dp[i][1] + num[i], num[i])$
要注意所有的数字都是负数的情况,特判一下。
#include<cstdio> #include<cstdlib> #include<map> #include<set> #include<iostream> #include<cstring> #include<algorithm> #include<vector> #include<cmath> #include<stack> #include<queue> #define inf 0x7fffffff using namespace std; typedef long long LL; typedef pair<string, string> pr; int n; const int maxn = 2e5 + 5; int num[maxn]; int dp[maxn][2]; int main() { scanf("%d", &n); bool allminus = true; int mx = -10005; for(int i = 0; i < n; i++){ scanf("%d", &num[i]); if(num[i] >= 0)allminus = false; mx = max(mx, num[i]); } dp[0][0] = 0; dp[0][1] = num[0]; for(int i = 1; i < n; i++){ dp[i][0] = max(dp[i - 1][0], dp[i - 1][1]); dp[i][1] = max(dp[i - 1][1] + num[i], num[i]); } if(allminus)printf("%d ", mx); else printf("%d ", max(dp[n - 1][0], dp[n - 1][1])); return 0; }