❀ 題目傳送門 ❀
https://atcoder.jp/contests/dp/tasks/dp_c
❀ 解題小技巧 ❀
這題主要的想法是第一格是位置,第二格是狀態。
dp[i][j]
的意思是第 i 天時選的是 j 活動,又連續兩天不能同一個活動。
因此轉移式是這樣的:
若我選了第 1 個活動,那麼那一格就是 上一個活動選第 2 個活動
or 上一個活動選第 3 個活動
值比較大者,再加當前值。
選了第 2 個活動、第 3 個活動 也是依此類推。
最後答案就是第 n 天時 活動1、活動2、活動3 最大者。
❀ 參考程式碼 ❀
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| #include <bits/stdc++.h> using namespace std; #define burst ios::sync_with_stdio(0); cin.tie(0);
int main(){ int dp[100005][3]; memset(dp, 0, sizeof(dp)); int v[100005][3]; int n; cin >> n; for(int i = 1; i <= n; i++){ for(int j = 0; j < 3; j++){ cin >> v[i][j]; } } for(int i = 1; i <= n; i++){ dp[i][0] = max(dp[i-1][1], dp[i-1][2]) + v[i][0]; dp[i][1] = max(dp[i-1][0], dp[i-1][2]) + v[i][1]; dp[i][2] = max(dp[i-1][0], dp[i-1][1]) + v[i][2]; } cout << max({dp[n][0], dp[n][1], dp[n][2]}); }
|