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 ...
随机推荐
- position与float
position:fixed/absolute和float的关系:元素设置position:absolute / fixed后,float属性是没有效果的.对于position: absolute元素 ...
- 安卓导航抽屉 Navigation Drawer 实现沉浸通知栏
在使用 Navigation Drawer Activity 模版的时候,遇到了通知栏无法完全沉浸的问题,尝试搜索一些现有的解决方法,但是或多或少都会存在一些问题,通过反复尝试找到找到了一种比较靠谱的 ...
- python入门基础知识一(基于孙兴华python自动化)
print('aaa')等价于print("aaa") 英文单引号和双引号在字符串的输出上并无区别,但如果要打印这么一段话:I'm interested in Python. 就要 ...
- redis 2 主从和哨兵
主从: 概念:将一台redis服务器数据复制到其他redis服务器,前者是master,后者是slave.数据复制是单向,从主节点复制到从节点.master以写为主,slave以读为主一个zhu主节点 ...
- 129_Power Pivot&Power BI DAX不同维度动态展示&动态坐标轴
博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 一.背景 某天在和那还是叫我大铁吧 交流关于季度&月度同时展示的问题,感概中国式报表真的需求很微妙. 下面来看看到 ...
- 《HelloGitHub》第 74 期
兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣.入门级的开源项目. https://github.com/521xueweiha ...
- JAVA - 如果hashMap的key是一个自定义的类,怎么办?
JAVA - 如果hashMap的key是一个自定义的类,怎么办? 使用HashMap,如果key是自定义的类,就必须重写hashcode()和equals().
- Arraylist集合、对象数组
Arraylist集合 ArrayList是List接口的一个实现类,它是程序中最常见的一种集合. 他的特点:在增加或删除指定位置的元素时,会创建新的数组,效率比较低,因此不适合做大量的增删操作,Ar ...
- 【Redis】事件驱动框架源码分析(单线程)
aeEventLoop初始化 在server.c文件的initServer函数中,对aeEventLoop进行了初始化: 调用aeCreateEventLoop函数创建aeEventLoop结构体,对 ...
- vue-cli在webpack环境下怎样生成开发环境模板(适合初学者)
1.事先安装好cnpm(淘宝镜像) npm install -g cnpm --registry=https://registry.npm.taobao.org 这是网址,可以自己用命令行工具输入命令 ...