!-- Loading 底层遮罩 -->

P1541 乌龟棋

传送门

思路

题目的核心是要注意到所有卡牌全部用完刚好到达终点,因此在知道各个卡牌的使用情况后可以直接确定乌龟所在位置。为了好确定四张卡牌的使用情况,必需想办法界定卡牌的范围,可以考虑把卡牌纳入循环中来限定范围,那么这就是个四重循环,即一个四维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;
}
 

 

posted @ 2022-03-30 20:00  Thinker-X  阅读(35)  评论(0)    收藏  举报