乌龟棋(DP)
P1541 [NOIP 2010 提高组] 乌龟棋
题目背景
NOIP2010 提高组 T2
题目描述
小明过生日的时候,爸爸送给他一副乌龟棋当作礼物。
乌龟棋的棋盘是一行
乌龟棋中
游戏中,乌龟棋子自动获得起点格子的分数,并且在后续的爬行中每到达一个格子,就得到该格子相应的分数。玩家最终游戏得分就是乌龟棋子从起点到终点过程中到过的所有格子的分数总和。
很明显,用不同的爬行卡片使用顺序会使得最终游戏的得分不同,小明想要找到一种卡片使用顺序使得最终游戏得分最多。
现在,告诉你棋盘上每个格子的分数和所有的爬行卡片,你能告诉小明,他最多能得到多少分吗?
输入格式
每行中两个数之间用一个空格隔开。
第
第
第
输入数据保证到达终点时刚好用光
输出格式
一个整数,表示小明最多能得到的分数。
输入输出样例 #1
输入 #1
9 5
6 10 14 2 8 8 18 5 17
1 3 1 2 1
输出 #1
73
说明/提示
每个测试点 1s。
小明使用爬行卡片顺序为
对于
对于
对于
题解
看题解说四维数组,我去,这么想的?
设 fa,b,c,d 表示每种卡片分别用了 a 张、b 张、c 张、d 张时所得最大分数,那么此时应在第 a+2b+3c+4d+1 个格子,当前由 fa−1,b,c,d,fa,b−1,c,d,fa,b,c−1,d,fa,b,c,d−1 转移得到,再加上当前格子的分数。
设 gi 表示第 i 种卡片的数量,答案就是 fg1,g2,g3,g4。
代码:
int dp[50][50][50][50];
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
//
// freopen("E:/Code/C++/untitled1/input.txt","r",stdin);
// freopen("output.txt","w",stdout);
mem(dp);
int n,m;
cin >> n >> m;
int v[400],w[200],c[5];
mem(c);
f(i,0,n) cin >> v[i];
f(i,1,m+1)
{
cin >> w[i];
switch(w[i])
{
case 1: c[1]++;
break;
case 2: c[2]++;
break;
case 3: c[3]++;
break;
default:c[4]++;
}
}
dp[0][0][0][0] = v[0];
for(int i = 0;i <= c[1];++i)
for(int j = 0;j <= c[2];++j)
for(int k = 0;k <= c[3];++k)
for(int f = 0;f <= c[4];++f)
{
int t = i + j * 2 + k * 3 + f * 4;
if(i!= 0) dp[i][j][k][f] = max(dp[i][j][k][f],dp[i-1][j][k][f] + v[t]);
if(j!= 0) dp[i][j][k][f] = max(dp[i][j][k][f],dp[i][j-1][k][f] + v[t]);
if(k!= 0) dp[i][j][k][f] = max(dp[i][j][k][f],dp[i][j][k-1][f] + v[t]);
if(f!= 0) dp[i][j][k][f] = max(dp[i][j][k][f],dp[i][j][k][f-1] + v[t]);
}
cout << dp[c[1]][c[2]][c[3]][c[4]] << endl;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战