玩完了擺棋子游戲,現在我們來玩一個跳沙坑遊戲,你站在0號沙坑的位置上,再給定N個沙坑,每個沙坑均有一個分數X,跳至該沙坑即可得到分數X,一共N+1個沙坑排成一排,編號分別爲0,1,2,3…n,其中0號沙坑分數爲0,我們假設學長可以跳任意遠,且只能往前跳,但是他有一個毛病,就是他不喜歡跳至相鄰的沙坑,即如果跳到了i號沙坑,則他下次不會跳到i+1號沙坑,請你計算出學長最多可以得到多少分。
Input
多組測試第一行:樣例數目T(T<=50)對於每組數據,第一行表示N個沙坑(1<=N<=100000)第二行爲N個空格分開的整數,表示沙坑分數,每個沙坑分數均不超過1000
Output
對於每組數據,輸出一行答案,表示學長最多可以得到的分數
樣例輸入
2
3
1 8 2
4
10 7 6 14
樣例輸出
8
24
Hint
第一組樣例,直接跳至2號沙坑,得分爲8
第二組樣例,先跳至1號沙坑,再跳至4號沙坑,得分24
遞歸寫法
#include<iostream>
#include<algorithm>
using namespace std;
int opt(int *arr,int n) {
if (n == 0)
return arr[0];
else if (n == 1)
return max(arr[0], arr[1]);
else
return max(opt(arr, n - 2) + arr[n], opt(arr, n - 1));
}
int main() {
int count;
cin >> count;
while (count--)
{
int n;
cin >> n;
int* arr = new int[n + 1];
for (int i = 0;i < n;i++)
cin >> arr[i];
cout<<opt(arr, n)<<endl;
}
}
動態規劃
#include<iostream>
#include<algorithm>
using namespace std;
int main() {
int count;
cin >> count;
while (count--)
{
int n;
cin >> n;
int* arr = new int[n + 1];
int* dp = new int[n + 1];
for (int i = 0;i < n;i++)
cin >> arr[i];
dp[0] = arr[0];
dp[1] = max(arr[0], arr[1]);
for (int i = 2;i < n;i++) {
dp[i] = max(dp[i - 2] + arr[i], dp[i - 1]);
}
cout << *max_element(dp, dp + n)<<endl;
}
}