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)]转移

然后就是统计f[n][k][0-2],取最大值即可

下面贴代码

#include<cstdio>
#define max(a,b) ((a)>(b)?(a):(b))
using namespace std;
int ds[100005];
char ch;
int f[2][21][3];
int n,tot,ans;
void swap(int &a,int &b){
    int tmp;
    tmp=a;a=b;b=tmp;
}
int main(){
    freopen("GP2.in","r",stdin);
    freopen("GP2.out","w",stdout);
    scanf("%d%d",&n,&tot);
    for(int i=1;i<=n;i++){
        scanf("%s",&ch);
        if(ch==‘H‘)ds[i]=0;
        else if(ch==‘S‘)ds[i]=1;
        else ds[i]=2;
    }
    int pre=0,lst=1;
    for(int i=1;i<=n;i++)
    {
        for(int j=0;j<=tot;j++)
            for(int k=0;k<=2;k++)
            {
                for(int l=0;l<=2;l++)
                {
                    if(k==l)f[lst][j][k]=max(f[lst][j][k],f[pre][j][l]);
                    else if(j)f[lst][j][k]=max(f[lst][j][k],f[pre][j-1][l]);
                }
                f[lst][j][k]+=(ds[i]==(k+1)%3);
            }
        swap(pre,lst);
    }
    for(int i=0;i<=tot;i++)
        for(int j=0;j<=2;j++)
            ans=max(ans,f[pre][i][j]);
    printf("%d\n",ans);
    fclose(stdin);
    fclose(stdout);
}
时间: 2024-10-10 12:05:00

Hoof, Paper, Scissors(USACO)的相关文章

GYM 101667H Rock Paper Scissors(FFT)

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

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(&qu

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动态规划,打表

(转载)ACM训练计划,先过一遍基础再按此拼搏吧!!!!

ACM大量习题题库 ACM大量习题题库 现在网上有许多题库,大多是可以在线评测,所以叫做Online Judge.除了USACO是为IOI准备外,其余几乎全部是大学的ACM竞赛题库. USACO http://ace.delos.com/usacogate 美国著名在线题库,专门为信息学竞赛选手准备 TJU http://acm.tongji.edu.cn/ 同济大学在线题库,唯一的中文题库,适合NOIP选手 ZJU http://acm.zju.edu.cn/ 浙江大学在线题库 JLU htt

POJ题目(转)

http://www.cnblogs.com/kuangbin/archive/2011/07/29/2120667.html 初期:一.基本算法:     (1)枚举. (poj1753,poj2965)     (2)贪心(poj1328,poj2109,poj2586)     (3)递归和分治法.     (4)递推.     (5)构造法.(poj3295)     (6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996)二.图算法:     (

POJ题目分类(转)

初期:一.基本算法:     (1)枚举. (poj1753,poj2965)     (2)贪心(poj1328,poj2109,poj2586)     (3)递归和分治法.     (4)递推.     (5)构造法.(poj3295)     (6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996)二.图算法:     (1)图的深度优先遍历和广度优先遍历.     (2)最短路径算法(dijkstra,bellman-ford,floyd,hea

Java练习 SDUT-2733_小鑫の日常系列故事(二)——石头剪子布

小鑫の日常系列故事(二)--石头剪子布 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 小鑫在上幼儿园的时候,喜欢跟小伙伴健健玩石头剪子布的游戏 ,你能帮他们判断谁胜谁负么? Input 输入有两行,每一行都有可能为"Rock"(石头),"Scissors"(剪子),"Cloth"(布).第一行为小鑫的选择,第二行为健健的选择. Output 输出有一行,如果小鑫赢了

USACO抓牛catchcow (bfs)

这题是黄巨大出的比赛题. http://poj.org/problem?id=3278 Description Farmer John has been informed of the location of a fugitive cow and wants to catch her immediately. He starts at a point N (0 ≤ N ≤ 100,000) on a number line and the cow is at a point K (0 ≤ K ≤

bzoj usaco 金组水题题解(1)

UPD:我真不是想骗访问量TAT..一开始没注意总长度写着写着网页崩了王仓(其实中午的时候就时常开始卡了= =)....损失了2h(幸好长一点的都单独开了一篇)....吓得赶紧分成两坨....TAT.............. —————————————————————————————————————————————————————————————————————————————— 写(被虐)了整整一个月b站上usaco的金组题...然而到现在总共只写了100道上下TAT(当然是按AC人数降序排