最大連續子序列和(DP)
阿新 • • 發佈:2022-03-17
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