Description
N個數的序列,選出任意個,要求不能相鄰,求不相鄰的最大和。
Input
第一行是一個正整數 N。
第二行是N 個用空格隔開的正整數。
Output
只有一個正整數,爲不相鄰的最大和。
Sample Input
5
3 10 8 20 21
Sample Output
32
5≤n≤1000000
1≤每個數≤500
題目分析:
這個很明顯是一道DP題qwq
因爲對一個數,我們有兩個選擇,那便是需要2個維度——一個表示這個數選了,一個表示沒有選
如果上一個沒有選,那麼當前的選或者不選都可以,所以我們取大的值
如果上一個選了的的話並且當前想要去選的話,那麼我們便得要選擇上一個沒選過的來加上了;
實踐上面無非是:
我們設當沒選了的最優的是:f[i][0]
當前選了的最優的是: f[i][1]
那麼根據上面的分析便可以得到狀態轉移方程:
f[i][0] = max{f[i-1][0],f[i-1][1]}
f[i][1] = f[i-1][0]+a[i];
代碼:
#include <bits/stdc++.h>
using namespace std;
int n,ans;
int a[1000009],f[1000009][1];
int main()
{
cin>>n;
for (int i = 1; i <= n; i++)
cin>>a[i];
//初始的狀態,選的和沒選的
f[1][0] = 0;
f[1][1] = a[1];
for (int i = 2; i <= n; i++) //狀態轉移方程
f[i][0] = max(f[i-1][0],f[i-1][1]),
f[i][1] = f[i-1][0] + a[i];
ans = max(f[n][0],f[n][1]); //取最大的
cout<<ans;
return 0;
}