Luogu 1415-拆分数列-动态规划
Solution
首先要找到使得最后一个数最小, 只需定义一个数组$pre[i]$ 从区间$[pre[i], i]$表示的数, 是最小的能使前面的数递增的方案。
$[ pre[n], n]$即为最小的最后一个数。
接着我们依据这找出的最后一个数, 向前dp, 找出使得每个数都最大的方案。
前导0是非常坑的
我觉得我也不怎么懂这道dp, 看得有点懵TAT
Code
#include<cstdio>
#include<cstring>
#include<algorithm>
#define rd read()
#define rep(i,a,b) for(int i = (a); i <= (b); ++i)
#define per(i,a,b) for(int i = (a); i >= (b); --i)
using namespace std; const int N = ; int pre[N], nxt[N], a[N], n;
int ans[N]; char s[N]; bool cmp(int l1, int r1, int l2, int r2) {
while(a[l1] == && l1 <= r1) l1++;
while(a[l2] == && l2 <= r2) l2++;
if(r1 < l1 || r2 < l2) return ;
if(r1 - l1 < r2 - l2) return ;
else if(r1 - l1 > r2 - l2) return ;
for(int i = ; i <= r2 - l2; ++i)
if(a[l1 + i] > a[l2 + i]) return ;
else if(a[l1 + i] < a[l2 + i]) return ;
return ;
} int main()
{
scanf("%s", s + );
n = strlen(s + );
for(int i = ; i <= n; ++i) a[i] = s[i] - '';
for(int i = ; i <= n; ++i) pre[i] = ;
for(int i = ; i <= n; ++i)
for(int j = i; j >= ; --j)
if(cmp(pre[j - ], j - , j, i)) {
pre[i] = j; break;
}
nxt[pre[n]] = n;
for(int i = pre[n]; i <= n; ++i) nxt[i] = n;
int pos0 = pre[n];
while(a[pos0 - ] == ) pos0--, nxt[pos0] = n;
for(int i = pre[n] - ; i; --i)
for(int j = pre[n] - ; j >= i; --j)
if(cmp(i, j, j + , nxt[j + ])) {
nxt[i] = j; break;
}
for(int l = , i = nxt[]; l <= n; i = nxt[l]) {
for(int j = l; j <= i; j++) printf("%d",a[j]);
l = i + ;
if(l > n) break;
printf(",");
}
putchar('\n');
}
Luogu 1415-拆分数列-动态规划的更多相关文章
- luogu P2401 不等数列 |动态规划
题目描述 将1到n任意排列,然后在排列的每两个数之间根据他们的大小关系插入">"和"<".问在所有排列中,有多少个排列恰好有k个"< ...
- 洛谷P1415 拆分数列[序列DP 状态 打印]
题目背景 [为了响应党中央勤节俭.反铺张的精神,题目背景描述故事部分略去^-^] 题目描述 给出一列数字,需要你添加任意多个逗号将其拆成若干个严格递增的数.如果有多组解,则输出使得最后一个数最小的同时 ...
- luoguP1415 拆分数列 [dp]
题目描述 给出一列数字,需要你添加任意多个逗号将其拆成若干个严格递增的数.如果有多组解,则输出使得最后一个数最小的同时,字典序最大的解(即先要满足最后一个数最小:如果有多组解,则使得第一个数尽量大:如 ...
- CJOJ 1644 编辑距离 / Luogu 2758 编辑距离(动态规划)
CJOJ 1644 编辑距离 / Luogu 2758 编辑距离(动态规划) Description 字符串是数据结构和计算机语言里很重要的数据类型,在计算机语言中,对于字符串我们有很多的操作定义,因 ...
- 洛谷 P1415 拆分数列 解题报告
拆分数列 题目背景 [为了响应党中央勤节俭.反铺张的精神,题目背景描述故事部分略去^-^] 题目描述 给出一列数字,需要你添加任意多个逗号将其拆成若干个严格递增的数. 如果有多组解,则输出使得最后一个 ...
- 洛谷P1415 拆分数列(dp)
题目链接:传送门 题目: 题目背景 [为了响应党中央勤节俭.反铺张的精神,题目背景描述故事部分略去^-^] 题目描述 给出一列数字,需要你添加任意多个逗号将其拆成若干个严格递增的数.如果有多组解,则输 ...
- Luogu 2679 子串 (动态规划)
Luogu 2679 NOIP 2015 子串 (动态规划) Description 有两个仅包含小写英文字母的字符串 A 和 B.现在要从字符串 A 中取出 k 个互不重叠的非空子串,然后把这 k ...
- BZOJ 1500/Luogu 2042 - 维修数列 - [NOI2005][Splay]
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1500 题目链接:https://www.luogu.org/problemnew/sho ...
- 洛谷P1415 拆分数列
题目背景 [为了响应党中央勤节俭.反铺张的精神,题目背景描述故事部分略去^-^] 题目描述 给出一列数字,需要你添加任意多个逗号将其拆成若干个严格递增的数.如果有多组解,则输出使得最后一个数最小的同时 ...
随机推荐
- js 浏览器页面切换事件
document.addEventListener('visibilitychange', function() { console.log(isHidden() + "-" + ...
- prompt
[prompt] prompt() 方法用于显示可提示用户进行输入的对话框. prompt(text,defaultText) 参数 描述 text 可选.要在对话框中显示的纯文本(而不是 HTML ...
- 针对SO交期回写的工厂日历功能调整
针对所有SO回写的交期,在最终写入SAP系统时,如果交期落在周日的,则自动往后延迟一天到周一,前期已经开发的长节假日UI维护的功能不变(按照UI的开始和结束时间跳过此段时间不规划). 当加1天时落在国 ...
- cxf怎样提高webservice性能,及访问速度调优
性能: 1. 启用FastInfoset(快速信息集)webservice的性能实在是不敢恭维.曾经因为webservice吞吐量上不去,对webservice进行了一些性能方面的优化,采用了Fast ...
- 分布式监控系统Zabbix-3.0.3-完整安装记录
由于采用sendmail发送邮件,常常会被认为是垃圾邮件被拒,所以不推荐这种方式!这里,针对zabbix报警信息的发送,可以采用下面两种方式中的任意一种:1)利用sendEmail程序来发送报警邮件. ...
- 全国高校绿色计算大赛 预赛第一阶段(C++)第3关:旋转数组
挑战任务 在计算机中,一张数字图像,可以被看做是一个矩阵或者说数组. 学过线性代数的同学对矩阵肯定不陌生.一般来说,图像是一个标准的矩形,有着宽度(width)和高度(height).而矩阵有着行(r ...
- JAVA 关于JNI本地库加载
1.调用JNI的时候,通常我们使用System.loadLibrary(String libname)来load JNI library, 同样也可以使用System.load(String file ...
- Maven 标签
scope 1.compile:默认值 他表示被依赖项目需要参与当前项目的编译,还有后续的测试,运行周期也参与其中,是一个比较强的依赖.打包的时候通常需要包含进去 2.test:依赖项目仅仅参与测试相 ...
- Linux之间配置SSH互信(SSH免密码登录)
为简化SSH过程,采用证书方式,免去SSH登入时需要输入账号密码的过程,具体操作如下: 一.在SSH服务器所在机器上 1.以root用户登录,更改ssh配置文件 /etc/ssh/sshd_confi ...
- ES6之对象的简洁表示法
ES6 允许直接写入变量和函数,作为对象的属性和方法.这样的书写更加简洁. let name = 'Pirates of the Caribbean', index = 5, captain = { ...