CF1774C Ice and Fire 【dp】
题意
给定一个由和组成的长度为的串,每一位作为两个数对战的环境。若环境值为,则较小的数胜利,反之则较大的数获胜。
个人(第个人自身的数为)在环境中对战,共有场战斗。在第个环境中任选两个剩下的人进行对战,胜者在第个环境与下一个人对战。
求参加人数不超过的人的条件下,每种人数下会有多少人有可能获胜。
分析
令表示时的获胜人数。
假设当前环境为,尝试分类讨论:
- :
-
:无论在任何排列的情况下,值为的数都不能成为胜者,对答案无贡献,因为比前个数都要大。
-
:胜者会被替代,答案无变化
-
故
- :
-
:容易发现,可以放在第场比赛并成为胜者,然后一定会被第场比赛的选手击败。若也是1,那么又可以放在第场比赛,又可以产生两名选手获胜的可能性;简而言之,若串的长度为,那么就会增加名胜者。
-
:同上。
-
故,其中为第位前连续子串的长度。
Code
#include<iostream>
#include<cstring>
const int maxn = 2e5 + 10;
int T, n, dp[maxn];
char ch[maxn];
int main() {
scanf("%d", &T);
while (T--) {
scanf("%d", &n);
std::cin >> ch;
int len = 1;
dp[0] = 1;
for (int i = 1; i < n - 1; i++) {
if (ch[i] == ch[i - 1]) {
++len;
dp[i] = dp[i - 1];
} else {
dp[i] = dp[i - 1] + len;
len = 1;
}
}
for (int i = 0; i < n - 1; i++)
printf("%d ", dp[i]);
printf("\n");
}
return 0;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
2022-01-07 线性最小二乘法
2022-01-07 图论简单代码模板(Matlab)
2022-01-07 树的重心、点分治学习笔记
2022-01-07 0-1整数规划
2022-01-07 插值简述