中矿大 C 石头剪刀布【决策DP*待看】

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

齐齐和司机正在玩剪刀石头布,不过他俩有些玩腻了,所以思考了一个全新的“剪刀石头布”的游戏。

全新的“剪刀石头布“”的胜负规则和剪刀石头布一样,每人有3种手势,分别为剪刀(scissors)、石头(rock)、布(paper)。剪刀胜于布,布胜于石头,石头胜于剪刀,当手势相同时为平局。

齐齐可以在司机出手势后再出自己的手势,但是不能连续两局出同一种手势。

他们一共进行n盘对局。每一盘中,胜者+1分,败者-1分,平局两人都不扣分。

已知司机的n局的出手势情况,求齐齐进行n盘对局后获得的最高分数。

输入描述:

第1行输入一个整数n,代表进行n盘对局。

第2-n+1行,每行输入一个字符串,为“scissors”、“rock”、“paper”之一,代表司机第i盘对局的手势情况。

数据保证:1≤n≤106

输出描述:

输出一行结果,代表齐齐进行n盘对局后获得的最高分数。

示例1

输入

3
rock
paper
scissors

输出

3

说明

齐齐可以第1盘出“paper”,第2盘出“scissors”,第3盘出“rock”,最高分数3分。

示例2

输入

2
rock
rock

输出

1

说明

齐齐可以第1盘出“paper”,第2盘出“rock”,最高分数1分。

【分析】:

【代码】:

#include<iostream>
#include<cstdio>
#include<cstring>

using namespace std;

int dp[10000001][3] = {0};
int n = 0;
int s[1000001] = {0};

inline int getScole(int a,int b)
{
    if(a==2&&b==1) return 1;
    if(a==1&&b==2) return -1;
    if(a==1&&b==0) return 1;
    if(a==0&&b==1) return -1;
    if(a==0&&b==2) return 1;
    if(a==2&&b==0) return -1;
    return 0;
}

int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        char ss[10];
        cin>>ss;
        if(strcmp(ss,"scissors") == 0)
        {
            s[i]=2;
        }
        else if(strcmp(ss,"paper") == 0)
        {
            s[i]=1;
        }
        else if(strcmp(ss,"rock") == 0)
        {
            s[i]=0;
        }
    }
    dp[1][0]=getScole(0,s[1]);
    dp[1][1]=getScole(1,s[1]);
    dp[1][2]=getScole(2,s[1]);
    for(int i=2;i<=n;i++)
    {
        for(int j=0;j<3;j++)
        {
            dp[i][j]=max(dp[i-1][(j+1)%3],dp[i-1][(j+2)%3])+getScole(j,s[i]);
        }
    }
    cout<<max(max(dp[n][0],dp[n][1]),dp[n][2])<<endl;
    return 0;
}

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<fstream>//石头1 剪刀2 布3
#include<cmath>
#include<algorithm>//while(r<l)
using namespace std;
int a[1111111];
int dp1[1111111];
int dp2[1111111];
int dp3[1111111];
char s[11];
int main()
{
    int n;
    int ans=0;
    cin>>n;
    memset(dp1,0,sizeof(dp1));
    memset(dp2,0,sizeof(dp2));
    memset(dp3,0,sizeof(dp3));
    for(int i=0;i<n;i++)
    {
        cin>>s;
        if(s[0]==‘r‘) a[i]=1;
        if(s[0]==‘s‘) a[i]=2;
        if(s[0]==‘p‘) a[i]=3;
        if(a[i]==1)
        {
            dp3[i]+=1;
            dp2[i]-=1;
            if(i!=0)
            {
                dp3[i]+=max(dp2[i-1],dp1[i-1]);
                dp2[i]+=max(dp3[i-1],dp1[i-1]);
                dp1[i]+=max(dp2[i-1],dp3[i-1]);
            }
        }
        if(a[i]==2)
        {
            dp1[i]+=1;
            dp3[i]-=1;
            if(i!=0)
            {
                dp3[i]+=max(dp2[i-1],dp1[i-1]);
                dp2[i]+=max(dp3[i-1],dp1[i-1]);
                dp1[i]+=max(dp2[i-1],dp3[i-1]);
            }
        }
        if(a[i]==3)
        {
            dp2[i]+=1;
            dp1[i]-=1;
            if(i!=0)
            {
                    dp3[i]+=max(dp2[i-1],dp1[i-1]);
                dp2[i]+=max(dp3[i-1],dp1[i-1]);
                dp1[i]+=max(dp2[i-1],dp3[i-1]);
            }
        }

    }
        cout<<max(max(dp1[n-1],dp2[n-1]),dp3[n-1]);
    return 0;
}

2

时间: 2024-08-11 05:08:32

中矿大 C 石头剪刀布【决策DP*待看】的相关文章

hdu2686 多决策dp

来回可以看作从(1,1)出发到(n,n)的两条不相交的路径 //dp[k][x1][y1][x2][y2] = max(dp[k-1][x1-1][y1][x2-1][y2],dp[k-1][x1-1][y1][x2][y2-1],dp[k-1][x1][y1-1][x2-1][y2],dp[k-1][x1][y1-1][x2][y2-1])//k为步数//k与x1,y1有关,可以降到三维 //多决策dp //dp[k][x1][y1][x2][y2] = max(dp[k-1][x1-1][y

BZOJ 3611: [Heoi2014]大工程 [虚树 DP]

传送门 题意: 多次询问,求最长链最短链链总长 煞笔$DP$记录$d,c,f,g$ $MD$该死拍了一下午没问题然后交上去就$T$ 然后发现树链剖分写成$size[v]+=size[u]$ 我想知道我随机生成的大数据是怎么跑过去的!!!!!!!! #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using

java面试题大合集(开发者必看)

前言 本文来自百度网络的一篇文章,由于没有答案,现在整理了一些比较好的回答和好的博客,可以自己扩展思路,如果大家有一下面试题的更好的答案,欢迎在评论区留言.以上全部来自网络!此外,我的微信公众号将每日分享下面面试题相关的知识点总结干货,欢迎关注微信公众号:好好学java! 文章推荐 精选java等全套学习资源 精选java电子图书资源 精选大数据学习资源 java项目练习精选 基本概念 1.操作系统中 heap 和 stack 的区别 堆:堆空间一般由程序员来分配,可以由垃圾回收机制来回收.一般

博客园美化教程大集合(超详细,看这篇就够了)

阅读目录: 1. 前言 2. 定制自己的博客 0. 美化整体效果 1. 准备工作 2. 自定义个性化导航栏 3. 添加顶部博主信息 4. 添加顶部滚动公告 5. 为博客文章添加目录导航 6. 添加分享功能按键 7. 定制推荐和反对按键的炫酷样式 8. 添加快速返回顶部的功能按键 9. 添加打赏功能按键 10. 添加页面放大缩小功能按键 11. 添加Github图标及链接 12. 添加公告栏图片 13. 添加公告栏文字信息 14. 添加公告栏个性时钟 15. 为公告栏添加访客来源统计 16. 为公

【偶像大师 白金星光】的【Variable Tone】技术大公开!偶像从哪里看都那么可爱,VA小组谈制作方针

http://game.watch.impress.co.jp/docs/news/1016369.html 自从街机版的运营依赖,今年迎来了[偶像大师]系列的11周年.在CEDEC 2016的第一天,开展了关于最新作PS4上的[偶像大师  白金星光]的演讲. 登台演讲的,有万代南梦宫工作室的视觉美术阿部貴之氏,本做的背景主美富田智子氏,以及本作的主程前澤圭一氏. 本作作为系列的第一个PS4版,从发布开始偶像们的视觉表现就得到了很高的评价,这次的演讲是以制作时的视觉表现的[目标]为主题的. 万代

大陆上facebook,注册,看youtube教程(手机电脑都可以用)

iphone/ipad/安卓手机平板怎么注册facebook youtube看视频如何上facebook推特twitter|Youtube/Vimeo注册下载视频电脑用直接下载一个i7vpn加速器即可解决啦 第一步,首先下载i7vpn软件下载完毕,找到下载好的软件解压到桌面 第二步,点击桌面的i7vpn软件 第三步,登陆账号密码 第四步,点击选择节点,会出现国内节点和国际节点,请选择国际节点,然后选择线路进行连接. 第五步,连接成功 第六步,显示上图后点击美国facebook网站,注册个账号就可

推广大盘点,想赚钱的看这里!

http://www.3agpl.com每个商家都怀着一颗赚钱的心投奔电商行业,但有着各种原因,以致自家的店铺止步不前,销量低下.其实赚钱的前提是销量!销量上不去了,还怎么赚钱?销量上去了,钱自然而然就会多起来,赚钱也就成了一件简单事了.增大销量就需要推广,把自己的品牌推出去,关键词排名.权重等上来了,方可在众多同类型的商铺中崭露头角.推广的方式多种多样,有免费的,也有收费的:有成效快的,也有成效慢的:每种方式各有所长,同时也各有所短.下面给大家一一盘点. 1.搜索引擎推广 搜索引擎推广通过对网

AI“淘金”大时代: 从移动开发模式看百度DuerOS商业化为什么会成功?

把时间向回倒去十年,在2008年的时候,智能机刚刚开始它的征程,开发者的想象力远不如今天丰富,那时候科技界似乎还不知道,接下来十年要与一件东西朝夕相处:平台. 2008年,谷歌正式发布安卓1.0.此后在移动互联网时代中,触屏成为了人机交互的主要方式.基于IOS与安卓的开发者生态与移动应用开发商业模式,撑起了十年间全球发展速度最快的一桩"生意",满足了无数开发者的商业梦想与人生价值实现. 而在AI时代到来之时,语音交互开始扭转人机交互的存在形态,用户与设备间基于语音交互的全新关系开始搭建

直接影响你薪资的一套大数据企业面试题,看完记得收藏转发哦!

经历了水深火热的大数据学习,终于拨开云雾见天明了,但你离成功总是还差了一步,那就是拿到大数据工程师的Offer. 在电脑旁奋斗了无数个日夜,代码敲了无数遍,项目整改了无数遍,只为了得到一份自己满意的高薪资高待遇的Offer.但这个收获不仅仅需要你学到娴熟的大数据技术,还需要在面试之前精心准备,了解自己要应聘的企业发展状况. 自己应聘岗位的技术要求等等,除此之外,多看一些大数据面试题也是很有必要的,给自己涨涨经验. 小编虽然不能帮你调查你理想企业的发展状况,但大数据常见面试题早已经为你准备好了,需