【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行给出 ...
随机推荐
- 外企面试,哪有你想象的那么难!(已收埃森哲、NTTDATA等8家外企offer)
无精疯,一名背包客,大学期间穷游了十余个国家,五十余座城市,也是一位拥有健身教练证的业余健身痴迷者.从大二开始自学Java并开始了第一份实习,后面也是通过自学转到了大数据,之前在一家大数据独角兽实习, ...
- 「模拟赛20180306」回忆树 memory LCA+KMP+AC自动机+树状数组
题目描述 回忆树是一棵树,树边上有小写字母. 一次回忆是这样的:你想起过往,触及心底--唔,不对,我们要说题目. 这题中我们认为回忆是这样的:给定 \(2\) 个点 \(u,v\) (\(u\) 可能 ...
- wampserver切换php版本问题
安装的wampserver有两个php版本,一个5.6的.一个7.1的,之前一直使用的php5.6的版本,今天切换7.1版本,切换成功了 phpinfo显示的版本也是7.1,但是php -v显示的却始 ...
- Swift几行代码解决UITableView空数据视图问题
tableView空数据问题 一般项目中tableView若数据为空时会有一个提示示意图 为了更好的管理这种提示示意图,笔者利用extension进行了简单的拓展 解决思路 利用swift面向协议的特 ...
- DHCP服务器的设计
介绍 DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)通常被应用在大型的局域网络环境中,主要作用是集中的管理.分配IP地址,使网络环境中的主机动态的 ...
- urlScan 配置阻止sql注入
工具 urlscan_v31_x64 urlscan_v31_x86 URLScan是一个IIS下的ISAPI 筛选器,它能够限制服务器将要处理的HTTP请求的类型.通过阻止特定的 HTTP 请求,U ...
- 两个线程分别打印 1- 100,A 打印偶数, B打印奇数
package com.demo.thread; public class PrintNumber { private static Object lock = new Object(); priva ...
- Fence Repair (二叉树求解)(优先队列,先取出小的)
题目链接:http://poj.org/problem?id=3253 Fence Repair Time Limit: 2000MS Memory Limit: 65536K Total Sub ...
- GCD Guessing Game Gym - 100085G 猜数字 gcd
http://codeforces.com/gym/100085/attachments 因为那个数字是一个质数,这样的猜的次数是最多的,所以至少是质数次. 但是如果需要猜2.3,那么可以直接猜6,也 ...
- js执行上下文和执行栈
执行上下文就是JavaScript 在被解析和运行时环境的抽象概念,JavaScript 运行任何代码都是在执行上下文环境中运行的,执行上下文包括三个周期:创建——运行——销毁,重点说一下创建环节. ...