【題目敘述】https://zerojudge.tw/ShowProblem?problemid=e721
【解題想法】DP
#include <iostream>
using namespace std;
int n, a[505], mx, b, dp[505];
int main() {
cin >> n;
for (int i = 1; i <= n; i++){
cin >> b;
mx = max(mx, b);
a[b] += b;
}
dp[1] = a[1];
dp[2] = a[2];
for (int i = 3; i <= mx; i++){
dp[i] = max(dp[i-3], dp[i-2]) + a[i];
}
cout << max(dp[mx-1], dp[mx]) << "\n";
}
Python code (credit: Amy Chou, 9/12/2020)
N = int(input())
val = list(map(int, input().split()))
mn = min(val)
mx = max(val)
a = [0 for i in range(mx+1)]
for v in val:
a[v] += v
dp = [0 for _ in range(mx+1)]
dp[1] = a[1]
dp[2] = a[2]
for i in range(3, mx+1):
dp[i] = max(dp[i-3], dp[i-2]) + a[i]
print(max(dp))