《地心護核者》食物恢復效果及持續時間一覽
阿新 • • 發佈:2022-03-30
題目的核心是要注意到所有卡牌全部用完剛好到達終點,因此在知道各個卡牌的使用情況後可以直接確定烏龜所在位置。為了好確定四張卡牌的使用情況,必需想辦法界定卡牌的範圍,可以考慮把卡牌納入迴圈中來限定範圍,那麼這就是個四重迴圈,即一個四維dp,可想而知以卡牌數來當成dp的四個狀態是合適的,在某種卡牌使用情況的最大值就可由各卡牌分別減一來轉移。
#include <iostream> using namespace std; int dp[47][47][47][47], N, M, T[5], map[357]; int main(void) { cin >> N >> M;for (int i = 1; i <= N; i++) cin >> map[i]; for (int i = 1; i <= M; i++) { cin >> T[0]; T[T[0]]++; } dp[0][0][0][0] = map[1]; for (int i = 0; i <= T[1]; i++) for (int j = 0; j <= T[2]; j++) for (int k = 0; k <= T[3]; k++)for (int l = 0; l <= T[4]; l++) { if (i != 0) dp[i][j][k][l] = max(dp[i][j][k][l], dp[i - 1][j][k][l] + map[i + 2 * j + 3 * k + 4 * l+1]); if (j != 0) dp[i][j][k][l] = max(dp[i][j][k][l], dp[i][j - 1][k][l] + map[i + 2 * j + 3 * k + 4 * l+1]); if (k != 0) dp[i][j][k][l] = max(dp[i][j][k][l], dp[i][j][k - 1][l] + map[i + 2 * j + 3 * k + 4 * l+1]); if (l != 0) dp[i][j][k][l] = max(dp[i][j][k][l], dp[i][j][k][l - 1] + map[i + 2 * j + 3 * k + 4 * l+1]); } cout << dp[T[1]][T[2]][T[3]][T[4]] << endl; return 0; }