Module d
Expand description
§ABC 365 D - AtCoder Janken 3
refs: https://atcoder.jp/contests/abc365/tasks/abc365_d
use proconio::{input, marker::Chars};
const ROCK: usize = 0;
const PAPER: usize = 1;
const SCISSORS: usize = 2;
fn main() {
input! {
n: usize,
s: Chars,
}
// dp[N戦目が終わったとき][最後に出したのがR=0, P=1, S=2] = 最大勝利数
let mut dp = vec![vec![0; 3]; n + 1];
for i in 1..=n {
let dist = s[i - 1];
match dist {
'R' => {
dp[i][PAPER] = dp[i - 1][ROCK].max(dp[i - 1][SCISSORS]) + 1;
dp[i][ROCK] = dp[i - 1][SCISSORS].max(dp[i - 1][PAPER]);
dp[i][SCISSORS] = 0;
}
'P' => {
dp[i][SCISSORS] = dp[i - 1][ROCK].max(dp[i - 1][PAPER]) + 1;
dp[i][PAPER] = dp[i - 1][ROCK].max(dp[i - 1][SCISSORS]);
dp[i][ROCK] = 0;
}
'S' => {
dp[i][ROCK] = dp[i - 1][PAPER].max(dp[i - 1][SCISSORS]) + 1;
dp[i][SCISSORS] = dp[i - 1][PAPER].max(dp[i - 1][ROCK]);
dp[i][PAPER] = 0;
}
_ => unreachable!(),
}
}
println!("{}", dp[n][ROCK].max(dp[n][PAPER]).max(dp[n][SCISSORS]));
}