首页 > 其他分享 >题解:AT_abc365_d [ABC365D] AtCoder Janken 3

题解:AT_abc365_d [ABC365D] AtCoder Janken 3

时间:2024-08-15 22:40:44浏览次数:12  
标签:int 题解 ABC365D 高桥 Janken max 局出 青木

D - AtCoder Janken 3题解

题意:

高桥和青木要玩石头剪刀布,给你一个长度为 \(n\) 的字符串 \(s\) ,\(s\) 表示青木在第 \(i\) 局游戏中的动作(R表示石头,P表示布,S表示剪刀。)。

高桥不可以在任何一局中输给青木(即:高桥和青木只可以平局或高桥赢青木),且高桥第 \(i\) 局出的和第 \(i-1\) 局出的不能一样,现在,问你高桥可以胜几局?

解题思路

很明显是一道 \(\textrm{DP}\) 题:

定义状态:

\(f_{i,j}\) 表示第 \(i\) 局出 \(j\) 时最多可以获胜的局数(\(j = 1\)时表示出石头,\(j = 2\)时表示出布,\(j = 3\)时表示出剪刀)。

初始化:

if (s[0] == 'R') {
        f[0][1] = 0;//两人一起出石头,不计分
        f[0][2] = 1;//高桥出布,高桥加一分
        //注意:高桥不可以输给青木,所以f[0][3]不可以初始化为-1
    }
    if (s[0] == 'P') {
        f[0][2] = 0;//同理
        f[0][3] = 1;
    }
    if (s[0] == 'S') {
        f[0][1] = 1;
        f[0][3] = 0;
}

转移方程:

当\(s_i =\) R 时:

\[f_{i,1} = \max(f_{i-1,2}, f_{i-1,3})\\ f_{i,2} = \max(f_{i-1,1}, f_{i-1,3}) + 1 \]

(注意:\(f_{i,1}\) 是被 \(f_{i-1,2}\) 和 \(f_{i-1,3}\)转移过来的,因为高桥第 \(i\) 局出的和第 \(i-1\) 局出的不能一样,
高桥不可以中输给青木,所以 \(j\) 不可以取 \(3\) ,即:不可以出剪刀)。
当\(s_i =\) P 时:

\[f_{i,2} = \max(f_{i-1,1}, f_{i-1,3})\\ f_{i,3} = \max(f_{i-1,2}, f_{i-1,3}) + 1 \]

当\(s_i =\) S 时:

\[f_{i,1} = \max(f_{i-1,2}, f_{i-1,3}) + 1\\ f_{i,3} = \max(f_{i-1,1}, f_{i-1,2}) \]

答案就取 \(\max(f_{n - 1,1},f_{n - 1,2},f_{n - 1,3})\),(我的字符串 \(s\) 下标从 \(0\) 开始存)。

Code

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 2e5 + 10;
int n, ans, f[N][10];
string s;
main() {
    cin >> n >> s;
    if (s[0] == 'R') {
        f[0][1] = 0;
        f[0][2] = 1;
    }
    if (s[0] == 'P') {
        f[0][2] = 0;
        f[0][3] = 1;
    }
    if (s[0] == 'S') {
        f[0][1] = 1;
        f[0][3] = 0;
    }
    for (int i = 1; i < n; i++) {
        if (s[i] == 'R') {
            f[i][1] = max(f[i - 1][2], f[i - 1][3]);
            f[i][2] = max(f[i - 1][1], f[i - 1][3]) + 1;
        }
        if (s[i] == 'P') {
            f[i][2] = max(f[i - 1][1], f[i - 1][3]);
            f[i][3] = max(f[i - 1][1], f[i - 1][2]) + 1;
        }
        if (s[i] == 'S') {
            f[i][1] = max(f[i - 1][2], f[i - 1][3]) + 1;
            f[i][3] = max(f[i - 1][1], f[i - 1][2]);
        }
    }
    cout << max({f[n - 1][1], f[n - 1][2], f[n - 1][3]});
    return 0;
}

标签:int,题解,ABC365D,高桥,Janken,max,局出,青木
From: https://www.cnblogs.com/ACyming/p/18361928

相关文章

  • 题解:P10313 [SHUPC 2024] 占地斗士!
    题目大意给出一个由.和#组成的\(n\timesm\)矩阵,然后再给你这\(4\)种图像,用着四种图像对矩阵进行覆盖(每个只能用一次)。其中,#的位置不可以被图像遮挡,也不能放在不能放置的格子上。解题思路考虑使用爆搜。第一个图像:if(mp[i][j]!='#'&&mp[i+1][j+1]!='#'......
  • 题解:P10111 [GESP202312 七级] 纸牌游戏
    题目大意给出三个序列:\(a\),\(b\),\(c\)分别表示:分数,罚分以及小杨从第\(1\)轮至第\(......
  • 题解:AtCoder Janken 3
    D-AtCoderJanken3题解题意高桥和青木要玩石头剪刀布,给你一个长度为\(n\)的字符串\(s\),\(s\)表示青木在第\(i\)局游戏中的动作(R表示石头,P表示布,S表示剪刀)。高桥不可以在任何一局中输给青木(即:高桥和青木只可以平局或高桥赢青木),且高桥第\(i\)局出的和第\(i-1\)局......
  • Codeforces 232 B Table 题解 [ 蓝 ] [ 分组背包 ] [ 组合数学 ] [ 循环节 ]
    Codeforces232BTable。蒟蒻模拟赛上场切的一道蓝,非常难以置信我竟然能做蓝题。这题的数据范围初看还是比较坑的,\(10^{18}\)的值域很容易让人往矩阵加速那方面想。实际上在列出转移方程式后,我们发现状态是二维的,无法使用矩阵加速(或者说这样做很麻烦)。思路首先观察到每个边长......
  • AT_agc025_b RGB Coloring 题解
    ProblemSolution由于涂绿色的得分为\(A+B\),所以可以将红色与蓝色独立考虑。依次枚举红色的个数,假定为\(i\),所以剩余需要的得分为\(K-i\timesA\),判断是否能被\(B\)整除,若能,则蓝色个数为\(\frac{K-i\timesA}{B}\),设为\(j\),则总方案累加\(C^{i}_{n}\timesC^{j}_{n}\),除......
  • [Ynoi2016] 镜中的昆虫 题解
    难度在最近遇到的题里相对较高,在这里写一篇珂学题解。(以下是学校给的部分分)\(20\%\):直接暴力枚举。另外\(20\%\):假如我们取\(pre\),对于\(pre<l\)的,\(ans++\),明显二维偏序,树状数组或\(cdq\)即可,时间复杂度\(O(n\logn)\)。另外\(40\%\):相当于多加一个时间维,三维偏序,\(......
  • DELPHI四舍五入问题解决
    转自http://www.delphitop.com/html/jichu/153.html 感谢原作者。 这段时间在用DELPHI做一个财务系统时发现每一行的小计取了两位小数后与用SQL的ROUND查询出来的不一样,在程序中是用FormatFloat('0.00',ItemSum)函数来取值的,再用DXDBGRID网格显视合计,最终与SELECTSUM(ROUND(......
  • 【问题解决】PageOffice打开word文档报错:Office运行时错误,部分系统文件可能丢失或已损
    打开wps,右上角配置和修复工具取消勾选,确定再打开,重新勾选,确定,退出重启电脑,验证。--PS:本人自测成功,有些人的机器安装有MicrosoftOffice,取消之后(不需要重新勾选)就可以了;本人机器只安装了WPS适合这种操作。......
  • P10633 BZOJ2989 数列/BZOJ4170 极光 题解
    题目传送门前置知识CDQ分治|权值树状数组及应用|曼哈顿距离与切比雪夫距离的相互转化解法增加一维为时间戳,那么操作\(1\)等价于单点加。曼哈顿距离直接跑CDQ分治,貌似不太可做,考虑转化为切比雪夫距离。原曼哈顿坐标系中的点\((x_{1},y_{1}),(x_{2},y_{2})\)间的......
  • Ubuntu中编译使用ANTs(医学图像配准)含github无法访问问题解决
    目录第一步、修改hosts文件1.打开https://github.com.ipaddress.com/ 2.打开https://fastly.net.ipaddress.com/github.global.ssl.fastly.net#ipinfo3.打开hosts文件,并在文件末尾添加如下内容 第二步、编译ANTs1)首先安装git、cmake以及c++编译器2)编译3)配置bin目录,......