【題解】HDU 1087 Super Jumping! Jumping! Jumping!

【題目敘述】https://vjudge.net/problem/HDU-1087
【解題想法】DP

  • 題目要求從start-point(分數最小)往end-point(分數最大)跳,每次都只能跳往分數更高的棋子。
  • mx[i]:跳到第 i 顆棋子時,累計的最高分數。
  • 狀態轉移方程:
    • 跳到第 i 顆棋子之前,可以經由第 j 顆棋子(0 <= j < i)
    • 如果 a[j] < a[i],mx[i] = max(mx[i], mx[j] + a[i]);
#include <iostream>
using namespace std;

int n, a[1005], mx[1005], ans;

int main() {
    while (cin >> n){
        if (n == 0) break;
        ans = 0;
        for (int i = 0; i < n; i++){
            cin >> a[i];
            mx[i] = a[i];
            for (int j = 0; j < i; j++){
                if (a[i] > a[j]) mx[i] = max(mx[i], mx[j] + a[i]);
            }
            ans = max(ans, mx[i]);
        }
        cout << ans << "\n";
    }
}
分享本文 Share with friends