【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行给出 ...
随机推荐
- 关于给gridSelect控件设置默认值
给这个选择表格框添加默认值: <td class="form_label"> 客户名称: ...
- 解决request中文乱码问题
因为request请求都是ISO-8859-1,而jsp页面是采用UTF-8编码,所以当传递的参数有中文时,页面会出现乱码,但是可以将取到的数据通过String的构造函数使用指定的编码类型重新构造一个 ...
- .net core webapi框架
折腾了一段时间..还是用ef比较熟,哈哈 参考地址:https://www.cnblogs.com/danvic712/p/10331976.html --jwt 参考地址:https://www.c ...
- jmeter csv中获取带引号的数据详情(转)
最近在工作中,对jmeter实践的点滴的记录这里分享,不一定正确,仅供参考和讨论,有想法的欢迎留言.谈论. 1技巧1:从csv中获取带引号的数据详情 背景:我们从csv中获取数据,在jmeter中使用 ...
- POJ1024 Tester Program
题目来源:http://poj.org/problem?id=1024 题目大意: 有一个迷宫,迷宫的起点在(0,0)处.给定一条路径,和该迷宫墙的设置,要求验证该路径是否为唯一的最短路径,该种墙的设 ...
- Luogu P4159 [SCOI2009]迷路 矩阵快速幂+精巧转化
大致就是矩阵快速幂吧.. 这个时候会发现这些边权$\le 9$,然后瞬间想到上回一道题:是不是可以建一堆转移矩阵再建一个$lcm(1,2,3,4,5,6,7,8,9)$的矩阵?...后来发现十分的慢q ...
- TOMCAT热部署 catalina.home catalina.base
catalina.home 一台机器通常只有一个, 指向Tomcat的安装目录 catalina.base 一台机器可以启动多个Context, 每个Context对应一个catalina.base ...
- F. Gourmet and Banquet(贪心加二分求值)
题目链接:http://codeforces.com/problemset/problem/589/F A gourmet came into the banquet hall, where the ...
- GCD Guessing Game Gym - 100085G 猜数字 gcd
http://codeforces.com/gym/100085/attachments 因为那个数字是一个质数,这样的猜的次数是最多的,所以至少是质数次. 但是如果需要猜2.3,那么可以直接猜6,也 ...
- vs2017 运行所选代码生成器时出错
[转]https://blog.csdn.net/sunshineyang1205/article/details/80211313 ASPNET MVC Core中像Controller中添加控制器 ...