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 }
posted @ 2019-08-05 09:41  ZRQ666  阅读(111)  评论(0编辑  收藏  举报