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-拆分数列-动态规划的更多相关文章

  1. luogu P2401 不等数列 |动态规划

    题目描述 将1到n任意排列,然后在排列的每两个数之间根据他们的大小关系插入">"和"<".问在所有排列中,有多少个排列恰好有k个"< ...

  2. 洛谷P1415 拆分数列[序列DP 状态 打印]

    题目背景 [为了响应党中央勤节俭.反铺张的精神,题目背景描述故事部分略去^-^] 题目描述 给出一列数字,需要你添加任意多个逗号将其拆成若干个严格递增的数.如果有多组解,则输出使得最后一个数最小的同时 ...

  3. luoguP1415 拆分数列 [dp]

    题目描述 给出一列数字,需要你添加任意多个逗号将其拆成若干个严格递增的数.如果有多组解,则输出使得最后一个数最小的同时,字典序最大的解(即先要满足最后一个数最小:如果有多组解,则使得第一个数尽量大:如 ...

  4. CJOJ 1644 编辑距离 / Luogu 2758 编辑距离(动态规划)

    CJOJ 1644 编辑距离 / Luogu 2758 编辑距离(动态规划) Description 字符串是数据结构和计算机语言里很重要的数据类型,在计算机语言中,对于字符串我们有很多的操作定义,因 ...

  5. 洛谷 P1415 拆分数列 解题报告

    拆分数列 题目背景 [为了响应党中央勤节俭.反铺张的精神,题目背景描述故事部分略去^-^] 题目描述 给出一列数字,需要你添加任意多个逗号将其拆成若干个严格递增的数. 如果有多组解,则输出使得最后一个 ...

  6. 洛谷P1415 拆分数列(dp)

    题目链接:传送门 题目: 题目背景 [为了响应党中央勤节俭.反铺张的精神,题目背景描述故事部分略去^-^] 题目描述 给出一列数字,需要你添加任意多个逗号将其拆成若干个严格递增的数.如果有多组解,则输 ...

  7. Luogu 2679 子串 (动态规划)

    Luogu 2679 NOIP 2015 子串 (动态规划) Description 有两个仅包含小写英文字母的字符串 A 和 B.现在要从字符串 A 中取出 k 个互不重叠的非空子串,然后把这 k ...

  8. BZOJ 1500/Luogu 2042 - 维修数列 - [NOI2005][Splay]

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1500 题目链接:https://www.luogu.org/problemnew/sho ...

  9. 洛谷P1415 拆分数列

    题目背景 [为了响应党中央勤节俭.反铺张的精神,题目背景描述故事部分略去^-^] 题目描述 给出一列数字,需要你添加任意多个逗号将其拆成若干个严格递增的数.如果有多组解,则输出使得最后一个数最小的同时 ...

随机推荐

  1. Winform 事件

    事件参数:object sender - 事件主体EventArgs e - 事件数据函数体 - 我进行的操作 常用事件:点击事件click (1)Load事件:该事件在窗体加载到内存时发生,即在第一 ...

  2. html页面嵌套---分享功能

    1.使用原因 项目中用到了thymeleaf去渲染模板,但是我们这有一个分享的页面,分享出去的页面要加上与生成模板不一样的内容.因为重新再加一套模板又会引起内容的重复与资源浪费.这里就用到了JS的lo ...

  3. 新手必看ES6基础

    ES6 基础 一.新的变量声明方式 let/const 与var不同,新的变量声明方式带来了一些不一样的特性,其中最重要的两个特性就是提供了块级作用域与不再具备变量提升. 通过2个简单的例子来说明这两 ...

  4. redis 存储java对象 两种方式

    根据redis的存储原理,Redis的key和value都支持二进制安全的字符串 1.利用序列化和反序列化的方式存储java对象我们可以通过对象的序列化与反序列化完成存储于取出,这样就可以使用redi ...

  5. 查询结果null替换为0

    xxx表示字段名 mysql数据库 : ifnull( xxx , 0 ) oracle数据库:  NVL(xxx , 0 )

  6. 【C++】STL算法之remove_if

    之前写过这样一段代码: auto iter=remove_if(AllEdges.begin(),AllEdges.end(),[&](Edge* edge){return _isEedge( ...

  7. 在 Android Studio 上调试数据库 ( SQLite ) (转)

    转自:http://c.colabug.com/thread-1781696-1-1.html 以前 Eclipse 时代,调试 SQLite 都是将数据库文件导出到电脑,然后再用软件打开查看.现在我 ...

  8. sqlserver 当前时间减去30天

    参考 https://zhidao.baidu.com/question/750666819064717772.html select dateadd(dd,-30,getdate()) from 表 ...

  9. vue打包后,接口请求404的完美解决方案

    在开发环境中,和后台对接为了解决跨域问题,使用了代理,也就是vue的proxyTable,但是打包放到生产环境中去时,接口请求不到,404,原因是开发环境的代理并不能用到生产环境,但是直接在请求接口是 ...

  10. NumPy 字节交换

    NumPy 字节交换 在几乎所有的机器上,多字节对象都被存储为连续的字节序列.字节顺序,是跨越多字节的程序对象的存储规则. 大端模式:指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地 ...