AtCoder Beginner Contest 249 E - RLE // 动态规划 + 前缀和优化
题意:
求满足原长为N且转换后长度严格小于N条件的小写字母组成的字符串的数量,输出时对P取模。
其中,转换规则为,将连续相同的字串替换为“字符数量+字符”,如aaa替换为3a。
思路:
状态表示:
fi,j:原长为i且转换后长度为j的字符串的数量。
状态转移:
初始化:将仅包含一种字符的所有字符串进行初始化。
转移:先考虑暴力做法:fi,j:考虑最后一段连续相同字串的长度为k,其替换后的字串长度为u,那么fi,j = 25 * ∑ fi-k,j-u。注意到,u的取值最多仅有 { 2,3,4,5 },那么进行前缀和优化一下,计算时就可以由枚举所有k变为枚举所有u, 整体复杂度由O(N3)变为O(N2lgN)。
代码参考:
//Jakon:dp + 前缀和优化
#include <bits/stdc++.h>
#define LL long long
using namespace std; const int N = 3010, M = 4321; int n, p;
LL dp[N][M], pres[N][M];
// dp[i][j]:原串长度为i,转化后长度为j的方案数 int cal(int x)
{
int res = 2;
if(x >= 10) ++ res;
if(x >= 100) ++ res;
if(x >= 1000) ++ res;
return res;
} int main()
{
cin >> n >> p; for(int i = 1; i <= n; i++) dp[i][cal(i)] = 26;
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= min(i * 2, M - 1); j++) {
for(int mi = 1, k = 2; mi < i && k < j; mi *= 10, k++) {
int l = max(0, i - mi * 10), r = i - mi;
dp[i][j] = (dp[i][j] + 25 * (pres[r][j-k] - pres[l][j-k] + p)) % p;
}
pres[i][j] = (pres[i - 1][j] + dp[i][j]) % p;
}
} LL ans = 0;
for(int i = 0; i < n; i++) ans = (ans + dp[n][i]) % p;
cout << ans << endl; return 0;
}
AtCoder Beginner Contest 249 E - RLE // 动态规划 + 前缀和优化的更多相关文章
- AtCoder Beginner Contest 249 F - Ignore Operations // 贪心 + 大根堆
传送门:F - Keep Connect (atcoder.jp) 题意: 给定长度为N的操作(ti,yi). 给定初值为0的x,对其进行操作:当t为1时,将x替换为y:当t为2时,将x加上y. 最多 ...
- Atcoder beginner contest 249 C-Just K(二进制枚举)
题目大意:给你N个字符串,你可以从中选择任意数量的字符串,请统计在你的字串中,相同字母出现次数正好为K次的字母数.数据保证出现的字母都是小写字母. 1≤N≤15 1 ≤K≤N 一开始读题的时候读错了, ...
- AtCoder Beginner Contest 100 2018/06/16
A - Happy Birthday! Time limit : 2sec / Memory limit : 1000MB Score: 100 points Problem Statement E8 ...
- AtCoder Beginner Contest 154 题解
人生第一场 AtCoder,纪念一下 话说年后的 AtCoder 比赛怎么这么少啊(大雾 AtCoder Beginner Contest 154 题解 A - Remaining Balls We ...
- AtCoder Beginner Contest 177 题解
AtCoder Beginner Contest 177 题解 目录 AtCoder Beginner Contest 177 题解 A - Don't be late B - Substring C ...
- KYOCERA Programming Contest 2021(AtCoder Beginner Contest 200) 题解
KYOCERA Programming Contest 2021(AtCoder Beginner Contest 200) 题解 哦淦我已经菜到被ABC吊打了. A - Century 首先把当前年 ...
- AtCoder Beginner Contest 052
没看到Beginner,然后就做啊做,发现A,B太简单了...然后想想做完算了..没想到C卡了一下,然后还是做出来了.D的话瞎想了一下,然后感觉也没问题.假装all kill.2333 AtCoder ...
- AtCoder Beginner Contest 053 ABCD题
A - ABC/ARC Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Smeke has ...
- AtCoder Beginner Contest 136
AtCoder Beginner Contest 136 题目链接 A - +-x 直接取\(max\)即可. Code #include <bits/stdc++.h> using na ...
随机推荐
- 干货 | Nginx负载均衡原理及配置实例
一个执着于技术的公众号 Nginx系列导读 给小白的 Nginx 10分钟入门指南 Nginx编译安装及常用命令 完全卸载nginx的详细步骤 Nginx 配置文件详解 理解正向代理与反向代理的区别 ...
- scanf("%d",a[i]+j)为什么不加取地址符号
为什么我画的地方不加取地址符号? 不要在意标题为什么不加分号,因为长度太长了! 二维数组a[3][5]中,a[3]储存的是下一维的地址,a[1]等同于&a[1][0] 同理,a[1]+1等于& ...
- Fail2ban 使用Fail2ban监禁SSH服务的恶意IP
Fail2ban自带了很多服务的过滤器(filter)和动作(action),它已经帮你做好了,所以一般情况下我们无需定义,直接引用即可. 这边只是一个示例. 系统版本:Ubuntu 16.04.5 ...
- A* K短路
注:\(A*\) 求解K短路效率极其低下,时间复杂度\(O(nklog\ n)\),空间视题目而定,因为本质是爆搜,可求解数据范围较小的题目. 我们使用\(A*\)求解k短路: 首先需要预处理出估价函 ...
- Aged-cat 的 WebServer 配置详细流程
前言 最近看到一个不错的webserver项目,但是配置过程给的不详细,这里给出详细配置过程 项目地址:https://github.com/Aged-cat/WebServer (感谢老猫大神的项目 ...
- 内网穿透frp教程 windows远程桌面连接
鉴于ngrok不是特别好用 昨天又发现frp这个神器 在管理端还有图形界面十分友好 话不多说开始 准备工作 1.一个域名 2.一台服务器 一.域名与服务器 域名和服务器直接买就好咯 价格不高 一定要在 ...
- 可变参数——JavaSE基础
可变参数 方法声明中,在指定参数类型后加一个省略号...即可声明可变参数 可变参数必须是参数列表的最后一个参数 声明 public void test(int... i){ System.out.pr ...
- Linux查看系统参数配置
Linux查看系统参数 1.查看内存(以GB为单位) [root@rac1 ~]# free -g total :内存总数,物理内存总数 used :已使用内存 free :空闲的内存数 shared ...
- Acwing785.快速排序
Acwing785.快速排序 快排模板: y总教学大法好~: #include <iostream> using namespace std; const int N = 1000010; ...
- numpy中的np.round()取整的功能和注意
numpy中的np.round()取整的功能和注意 功能 np.round() 是对浮点数取整的一个函数,一般的形式为 np.round(a, b),其中a为待取整的浮点数,b为保留的小数点的位数 注 ...