跳沙坑(2)

玩完了擺棋子游戲,現在我們來玩一個跳沙坑遊戲,你站在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;
 }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章