最大连续子序列和(DP)

DP入门_最大连续子序列(最大连续和)


Description

有一条崎岖的山路,该山路被分成了n段(1<=n<=100,000),每段山路的驾驶体验不同。作为老司机的刘师傅给每段山路打分。
分值越高,表示驾驶体验越好;分值越低,表示驾驶体验越差。

例如,有一条山路被划分成6段,每段的驾驶体验值分别是:
{ -2,11,-4,13,-5,-2 },其中驾驶体验值总和最大的一段为红色数字表示:
{ -2,11,-4,13,-5,-2 },最大连续驾驶体验值和为20。
现在要求,输入一串数字(表示山路分的段值),输出最大连续驾驶体验值。

Input
第一行,输入n。表示有n段山路。

第二行,输入n个数字,空格隔开。表示每段的驾驶体验值。

Output
输出一个整数,表示最大连续体验值。


先上代码:

 1 #include<iostream>
 2 #include<cmath>
 3 using namespace std;
 4 int a[1000001];
 5 int f[1000001];
 6 int maxn=-1;
 7 int main()
 8 {
 9     int n;
10     cin>>n;
11     for(int i=1;i<=n;i++)
12     {
13         cin>>a[i];
14     }
15     f[1]=a[1];
16     for(int i=1;i<=n;i++)
17     {
18         f[i]=max(f[i-1]+a[i],a[i]);
19         maxn=maxn>f[i]? maxn:f[i];
20     }
21     cout<<maxn;
22     return 0;
23     
24 }

其实题目讲的就是在一个数组中找到某几个连续的数使得它们的和最大,针对这样的题,当然使用DP啦

先输入他们,f[i]数组代表是 i 状态时的最好方案(最大的和),值得注意的是,f[1]的状态就是a[i],因为就他一个。,我们现在的主要任务就是寻找此问题的状态转移方程,

仔细想想,我们会发现,我们想要求得的第i个状态的最好方案无非就两种,要么加他,要么不加他,再取个max就好了。

得到:f[i]=max(f[i-1]+a[i],a[i]) 

下面就顺水推舟的出来了

2022/3/17

posted @ 2022-03-17 19:47  你的小垃圾  阅读(97)  评论(0编辑  收藏  举报