!-- 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; }

 


__EOF__

本文作者星晴
本文链接https://www.cnblogs.com/xqk0225/p/16078820.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   Thinker-X  阅读(31)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示