BZOJ 4760 Hoof, Paper, Scissors

普及组dp.

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 100050
using namespace std;
int n,k,dp[maxn][21][4],p[maxn],map[5][5];
char s[5];
int main()
{
    map[2][1]=map[3][2]=map[1][3]=1;
    scanf("%d%d",&n,&k);
    for (int i=1;i<=n;i++)
    {
        scanf("%s",s);
        if (s[0]==‘P‘) p[i]=2;
        else if (s[0]==‘S‘) p[i]=3;
        else p[i]=1;
    }
    for (int i=1;i<=n;i++)
    {
        dp[i][0][1]=dp[i-1][0][1]+map[1][p[i]];
        dp[i][0][2]=dp[i-1][0][2]+map[2][p[i]];
        dp[i][0][3]=dp[i-1][0][3]+map[3][p[i]];
    }
    for (int i=1;i<=k;i++)
        for (int j=1;j<=n;j++)
        {
            dp[j][i][1]=max(dp[j-1][i][1],max(dp[j-1][i-1][2],dp[j-1][i-1][3]))+map[1][p[j]];
            dp[j][i][2]=max(dp[j-1][i][2],max(dp[j-1][i-1][1],dp[j-1][i-1][3]))+map[2][p[j]];
            dp[j][i][3]=max(dp[j-1][i][3],max(dp[j-1][i-1][1],dp[j-1][i-1][2]))+map[3][p[j]];
        }
    printf("%d\n",max(dp[n][k][1],max(dp[n][k][2],dp[n][k][3])));
    return 0;
}
时间: 2024-08-10 00:07:23

BZOJ 4760 Hoof, Paper, Scissors的相关文章

bzoj4760[USACO2017 Jan]Hoof,Paper,Scissors

题意:玩n次剪刀石头布,对方每次出什么已经知道了.你出的招数必须是连续的几段(不能超过k+1段),问你最多赢几次.(n<=100000,k<=20) 正常做法:f[i][j][k]表示前i次,分j段,最后一次出的是k(k=0,1,2)时最多赢几次,可以O(nk)解决,转移时看最近一次有没有新分一段即可. 智障做法:我们同样定义f[i][j][k]表示前i次,分j段,最后一次出的是k时最多赢几次,但转移的时候考虑最近的一段,也就是枚举最近的一段是从哪里开始的,那么这就变成了1D1D动态规划,打表

Hoof, Paper, Scissors(USACO)

题目大意: 一种游戏(类似于石头剪刀布):两个人分别给出一个字母,然后比较:H>S,S>P,P>H,我们已知对手的字母顺序,求在前n局中我们最多能赢多少次. 由于出字母的人非常懒,所以开局后会选定一种字母,中途只会改变k次,剩余状态下只会不停重复上一次出的字母,所以请你解决这个问题: 好吧,这道题就是DP题. f[i][j][k]表示出到第i局,改变了j次,目前出的是第k个字母的最多赢的局数. 然后每次DP可以从f[i-1][j][k]和f[i-1][j-1][l(l!=k)]转移 然后

SDUT 3568 Rock Paper Scissors 状压统计

就是改成把一个字符串改成三进制状压,然后分成前5位,后5位统计, 然后直接统计 f[i][j][k]代表,后5局状压为k的,前5局比和j状态比输了5局的有多少个人 复杂度是O(T*30000*25*m)m比较小,也就最多几十吧,将将过 #include <cstdio> #include <cstring> #include <algorithm> #include <iostream> #include <cstdlib> #include &

GYM 101667H Rock Paper Scissors(FFT)

题意:给你一个串a,是有R,S,P(石头剪刀布)构成的,然后还有一个序列b是你的出牌顺序,但你可以跳过机器的前x个出牌,从x+1开始出,问你最多赢几次 思路:好烦啊,这个题下午一直不会做,感觉和之前学弟将的一个模糊匹配的很像,但好像也不怎么像,挂机一下午. 这个题其实是利用了卷积的性质,我们先考虑单独的每一个字母,因为我们在卷积的时候不能牵扯其他的字符,如果有其他的字符,就类似于模糊匹配了,那是我们只是用FFT加速多项式乘法,而这道题的FFT其实是用FFT算出对于(FFT后的)第i个位置,我们字

HDOJ(HDU) 2164 Rock, Paper, or Scissors?

Problem Description Rock, Paper, Scissors is a two player game, where each player simultaneously chooses one of the three items after counting to three. The game typically lasts a pre-determined number of rounds. The player who wins the most rounds w

HDU 2164 Rock, Paper, or Scissors?

http://acm.hdu.edu.cn/showproblem.php?pid=2164 Problem Description Rock, Paper, Scissors is a two player game, where each player simultaneously chooses one of the three items after counting to three. The game typically lasts a pre-determined number o

POJ 3252 Round Numbers

Round Numbers Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 12824   Accepted: 4946 Description The cows, as you know, have no fingers or thumbs and thus are unable to play Scissors, Paper, Stone' (also known as 'Rock, Paper, Scissors',

poj3252-Round Number 组合数学

题目: Round Numbers Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8492   Accepted: 2963 Description The cows, as you know, have no fingers or thumbs and thus are unable to play Scissors, Paper, Stone' (also known as 'Rock, Paper, Scissor

一些简单的编程练习题

转载自 http://blog.jobbole.com/53039/ 每当成为入门CS课程(学生们学习编程语言的课程)的助教时,都困于提出好的练习题.Project Euler和类似的问题通常对初学者来说来难了,尤其是对于那些没有很强数学背景的同学. 在这篇文章中,Adrian Neumann 收集了一些从初级到高级逐级困难的练习题,适合刚开始学习编程的初学者.当有新的练习题时,Adrian 会及时添加.除了一些GUI问题外,练习题一般都是算法题,无需学习任何库就可以解决.课程练习题的困难程度有