【luogu P3609 [USACO17JAN]Hoof, Paper, Scissor蹄子剪刀布】 题解
题目链接:https://www.luogu.org/problemnew/show/P3609
看着标签什么记搜什么暴力点进来,读完题第一直觉DP?
还真是个\(DP\)。
题目所描述的状态十分明显,第 \(i\) 轮,变换 \(j\) 次,当前FJ手势 (\(x,y,z\))
那我们不妨直接令\(f[i][j][k]\)表示当前第 \(i\) 轮,变换 \(j\) 次,在FJ手势为 \(k\) 时的胜场为多少。(这里懒得考虑啥手势能胜FJ,故直接用FJ的手势为参考。)
那么在转移时,我们考虑的就是两种情况:
要么我换个手势赢FJ的当前手势,要么我不换手势。
对于换手势:
如果变换到\(x\)手势赢FJ:
\(f[i][j][x] = max(f[i-1][j-1][y], f[i-1][j-1][z]) + num[i][x]\)
其中,num[i][x]代表我当前是否能赢FJ的x手势,1为能赢,0为不能赢。
对于变换到y,z手势同理。
对于不换手势:
\(f[i][j][x] = f[i-1][j][x] + num[i][x]\)
所以总转移方程为:
\(f[i][j][x] = max(max(f[i-1][j-1][y], f[i-1][j-1][z]) + num[i][x], f[i-1][j][x] + num[i][x])\)
接下来就是O(NK)的转移,最后在第n轮中变换0~k次的三个不同手势中选出max即为答案。
code:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 1e5 + 10;
int f[maxn][21][3], k, n, answer;
int num[maxn][3];//H 0 P 1 S 2
int main()
{
scanf("%d%d",&n,&k);
for(int i = 1; i <= n; i++)
{
char s;
cin>>s;
if(s == 'H')
num[i][0] = 1;
if(s == 'P')
num[i][1] = 1;
if(s == 'S')
num[i][2] = 1;
}
for(int i = 1; i <= n; i++)
for(int j = 0; j <= k; j++)
{
if(j - 1 >= 0)//避免数组下标j-1越界
{
f[i][j][0] = max(max(f[i-1][j-1][1], f[i-1][j-1][2]) + num[i][0], f[i-1][j][0] + num[i][0]);
f[i][j][2] = max(max(f[i-1][j-1][1], f[i-1][j-1][0]) + num[i][2], f[i-1][j][2] + num[i][2]);
f[i][j][1] = max(max(f[i-1][j-1][0], f[i-1][j-1][2]) + num[i][1], f[i-1][j][1] + num[i][1]);
}
else
{
f[i][j][0] = f[i-1][j][0] + num[i][0];
f[i][j][2] = f[i-1][j][2] + num[i][2];
f[i][j][1] = f[i-1][j][1] + num[i][1];
}
}
for(int j = 0; j <= k; j++)
{
answer = max(answer, f[n][j][0]);
answer = max(answer, f[n][j][1]);
answer = max(answer, f[n][j][2]);
}
printf("%d",answer);
return 0;
}
后记:
一开始我交的WA了两次,原因是当j=0时j-1的数组下标导致越界。学校机房自测无误,到luogu上交出毛病来了,总觉得自己机子没有报错就无所谓,下次还需注意改掉这个毛病。(辣鸡dev)
【luogu P3609 [USACO17JAN]Hoof, Paper, Scissor蹄子剪刀布】 题解的更多相关文章
- 洛谷 P3609 [USACO17JAN]Hoof, Paper, Scissor蹄子剪刀…
P3609 [USACO17JAN]Hoof, Paper, Scissor蹄子剪刀… 题目背景 欢迎提供翻译,请直接在讨论区发帖,感谢你的贡献. 题目描述 You have probably hea ...
- Luogu【P3609】蹄子剪刀布(DP+滚动数组)
题目链接 (突然高兴 又一次瞬间想出转移方程并一遍A掉!!233333(虽然从二叉苹果树那题开始我就发现我的方程好像跟别人不大一样 (所以这样就可以名正言顺的水题解了 设f[i][j][k]表示考虑F ...
- 洛谷P3906 Hoof Paper, Scissor (记忆化搜索)
这道题问的是石头剪刀布的的出题问题 首先不难看出这是个dp题 其次这道题的状态也很好确定,之前输赢与之后无关,确定三个状态:当前位置,当前手势,当前剩余次数,所以对于剪刀,要么出石头+1分用一次机会, ...
- 【luogu P3608 [USACO17JAN]Balanced Photo平衡的照片】 题解
题目链接:https://www.luogu.org/problemnew/show/P3608 乍一看很容易想到O(N^2)的暴力. 对于每个H[i]从i~i-1找L[i]再从i+1~n找R[i], ...
- [BZOJ4760][Usaco2017 Jan]Hoof, Paper, Scissors dp
4760: [Usaco2017 Jan]Hoof, Paper, Scissors Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 136 Solv ...
- PAT (Basic Level) Practise:1018. 锤子剪刀布
[题目链接] 大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示: 现给出两人的交锋记录,请统计双方的胜.平.负次数,并且给出双方分别出什么手势的胜算最大. 输入格式: 输入第1行 ...
- PAT乙级 1018. 锤子剪刀布 (20)
1018. 锤子剪刀布 (20) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 大家应该都会玩“锤子剪刀布”的游 ...
- PAT-乙级-1018. 锤子剪刀布 (20)
1018. 锤子剪刀布 (20) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 大家应该都会玩“锤子剪刀布”的游 ...
- PAT_1018 锤子剪刀布
问题描述 大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示: 现给出两人的交锋记录,请统计双方的胜.平.负次数,并且给出双方分别出什么手势的胜算最大. 输入格式: 输入第1行给出 ...
随机推荐
- 开发外包注意事项二——iOS APP的开发
目前我的方式是按时间算. 首先这得建立在双方的信任基础上. 以我做过的Case为例: 首先会和客户一起评估需求: 1. 哪些功能是最为重要的 2. 哪些功能是可以删除的 3. 用什么策略保证APP的出 ...
- Struts2练习
首先从下载的Struts2中apps文件夹下选中需要联系的示例,拷贝jar包到eclipse项目WEB-INF/lib目录下,然后构建路径
- luoguP4931 情侣?给我烧了!(加强版)
luogu 普通版题解:https://www.cnblogs.com/lcxer/p/10876856.html 在普通版里,我们考虑对于\(n\)对情侣,恰好\(k\)对是和谐的方案数是 \[ a ...
- Kubernetes公开应用程序
pod丢失之后,怎样让程序正常工作. service的概念和作用 标签 Pods 是有生命周期的.当一个工作节点死后,运行在该节点上的pods也会丢失.然后,通过创建新的pods来保持应用程序运行,R ...
- 关于map 及 map 骚操作
关于map这个东西 很冷门.................. 但是,这个博客带你稍微了解一下map: map用法:一般当作一个下表无穷大的数组 关于它的骚操作:map的鬼畜用法,可以 ...
- 未找到与约束 Micorosoft.CodeAnalysis.Editor.TypeScript.ToolsOptions.IUserSettingsProvider
问题: 未找到与约束 ContractName Micorosoft.CodeAnalysis.Editor.TypeScript.ToolsOptions.IUserSettingsProvide ...
- 【手撸一个ORM】第十步、数据操作工具类 MyDb
说明 其实就是数据库操作的一些封装,很久不用SqlCommand操作数据库了,看了点园子里的文章就直接上手写了,功能上没问题,但写法上是否完美高效无法保证,建议有需要的朋友自己重写,当然如果能把最佳实 ...
- 系统启动时,BIOS与影子内存_5
问题:“当我们按下电源开关时,电源开始供电,芯片组撤去RESET信号,CPU马上就从地址FFFF0H处开始执行指令,这个地址在系统BIOS的地址范围内,无论是Award BIOS还是AMI BIOS, ...
- NewStar 信息分发系统设计
目录 NewStar 信息分发系统设计 我想要怎么做 系统流程图 解释和初步的模板展示 NewStar 信息分发系统设计 我们在全世界发布网站本质就是向全世界分发我们的信息给客户/潜在客户,然后希望促 ...
- [Coding Style] CSS coding style
CSS coding style Note 结合实际工作中的规范和推荐大家使用的CSS书写规范.顺序这篇文章整合而成 Navigation CSS 书写顺序 CSS 常用文件命名 CSS 常用命名规范 ...