ABC365D 题解
赛时脑抽了没写出来。赛后一听说是 DP 就秒了 /wul
为方便,我们用数字代替字母,用 R
),S
),P
)。同时定义函数
定义一下状态。用
我们发现用上述状态可以很轻易地转移。我们可以通过前一位出的与当前出的不同的两种状态转移之。
有:
然后就做完了。记得先将
#include <iostream>
#include <cstdio>
#include <map>
using namespace std;
#define int long long
const int N = 200010;
int n, f[N][5]; string s;
map<char, int> mp;
int ne(int x) {return x % 3 + 1;}
signed main() {
cin >> n >> s; s = ' ' + s;
mp['R'] = 1, mp['S'] = 2, mp['P'] = 3;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= 3; j++) {
if(ne(mp[s[i]]) == j) continue;
f[i][j] = max(f[i - 1][ne(j)], f[i - 1][ne(ne(j))]);
if(ne(j) == mp[s[i]]) f[i][j]++;
}
}
int ans = 0;
for (int j = 1; j <= 3; j++) ans = max(ans, f[n][j]);
cout << ans;
return 0;
}
本文作者:Running-a-way
本文链接:https://www.cnblogs.com/Running-a-way/p/18341433
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步