题目链接: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蹄子剪刀布】 题解的更多相关文章

  1. 洛谷 P3609 [USACO17JAN]Hoof, Paper, Scissor蹄子剪刀…

    P3609 [USACO17JAN]Hoof, Paper, Scissor蹄子剪刀… 题目背景 欢迎提供翻译,请直接在讨论区发帖,感谢你的贡献. 题目描述 You have probably hea ...

  2. Luogu【P3609】蹄子剪刀布(DP+滚动数组)

    题目链接 (突然高兴 又一次瞬间想出转移方程并一遍A掉!!233333(虽然从二叉苹果树那题开始我就发现我的方程好像跟别人不大一样 (所以这样就可以名正言顺的水题解了 设f[i][j][k]表示考虑F ...

  3. 洛谷P3906 Hoof Paper, Scissor (记忆化搜索)

    这道题问的是石头剪刀布的的出题问题 首先不难看出这是个dp题 其次这道题的状态也很好确定,之前输赢与之后无关,确定三个状态:当前位置,当前手势,当前剩余次数,所以对于剪刀,要么出石头+1分用一次机会, ...

  4. 【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], ...

  5. [BZOJ4760][Usaco2017 Jan]Hoof, Paper, Scissors dp

    4760: [Usaco2017 Jan]Hoof, Paper, Scissors Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 136  Solv ...

  6. PAT (Basic Level) Practise:1018. 锤子剪刀布

    [题目链接] 大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示: 现给出两人的交锋记录,请统计双方的胜.平.负次数,并且给出双方分别出什么手势的胜算最大. 输入格式: 输入第1行 ...

  7. PAT乙级 1018. 锤子剪刀布 (20)

    1018. 锤子剪刀布 (20) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 大家应该都会玩“锤子剪刀布”的游 ...

  8. PAT-乙级-1018. 锤子剪刀布 (20)

    1018. 锤子剪刀布 (20) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 大家应该都会玩“锤子剪刀布”的游 ...

  9. PAT_1018 锤子剪刀布

    问题描述 大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示: 现给出两人的交锋记录,请统计双方的胜.平.负次数,并且给出双方分别出什么手势的胜算最大. 输入格式: 输入第1行给出 ...

随机推荐

  1. SnapKit swift实现高度自适应的新浪微博布局

    SnapKit swift版的自动布局框架,第一次使用感觉还不错. SnapKit是一个优秀的第三方自适应布局库,它可以让iOS.OS X应用更简单地实现自动布局(Auto Layout).GtiHu ...

  2. vue散碎知识点学习

    1. vue散碎知识点学习 1.1. 特点 数据渲染/数据同步 组件化/模块化 其他功能路由,ajax,数据流 1.2. Vue.js学习资源 vuejs中文官网:http://cn.vuejs.or ...

  3. thinkphp5.1 使用第三方扩展类库

    此案例介绍的不是通过composer加载的,是手工下载放入extend目录下的扩展类库,仍然以phpspider为例 将owner888目录放入extend目录下,也可以直接将phpspider目录放 ...

  4. 将vue和element-ui写在一个html里面方便调试(小白篇)

    声明:纯属小白进门文档 vue的官方文档: https://vuejs.bootcss.com/v2/guide/ 第一步:引入vue.js <script src="https:// ...

  5. Codeforces Round #363 (Div. 2) C

    Description Vasya has n days of vacations! So he decided to improve his IT skills and do sport. Vasy ...

  6. Flask&&人工智能AI --1

    Flask初识,Response三剑客,jsonify以及send_file.Request,模板语言 Jinja2,用户登录例子,内置Sessio 一.Flask初识 首先,要看你学没学过Djang ...

  7. 【Java】Tomcat 5默认的管理员用户和密码

    <?xml version='1.0' encoding='utf-8'?> <tomcat-users> <role rolename="tomcat&quo ...

  8. JMeter tomcat测试请求

    JMeter tomcat测试请求 Apache Jmeter是开源的压力测试工具,可以测试tomcat 的吞吐量等信息 下载地址: http://jmeter.apache.org/download ...

  9. Quality of Service (QoS) in LTE

    Background: Why we need QoS ? There are premium subscribers who always want to have better user expe ...

  10. SpringBoot | 第十七章:web应用开发之文件上传

    前言 上一章节,我们讲解了利用模版引擎实现前端页面渲染,从而实现动态网页的功能,同时也提出了兼容jsp项目的解决方案.既然开始讲解web开发了,我们就接着继续往web这个方向继续吧.通常,我们在做we ...