不相鄰最大和

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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章