P1115 最大子段和
P1115题库链接:https://www.luogu.org/problem/P1115
难度:普及-
算法标签:动态规划,DP,递推
1.DP O(n) 得分100
由于需要求的序列是连续的,所以我们定义状态为b[i]表示某子段最大和,其状态转移方程为b[i] = max(a, b[i - 1] + a)(表示若该子段最大和 + a比单独的a大,就加上a,否则a就自己成为一个子段)。因为最大的子段和不一定在最后,所以需要输出b数组中的最大值
1 #include <cstdio> 2 using namespace std; 3 int n, a, b[200100], sum = -9999; 4 int max(int a, int b) 5 { 6 if(a >= b) return a; 7 else return b; 8 } 9 int main() 10 { 11 scanf("%d", &n); 12 for(int i = 1; i <= n; ++i) 13 { 14 scanf("%d", &a); 15 b[i] = max(a, b[i - 1] + a); 16 sum = max(sum, b[i]); 17 } 18 printf("%d", sum); 19 return 0; 20 }