传送门

t(i,j)表示下标从i到j的数

d[i]表示以i结尾的最小的数的下标

d[i]=max(j) (1<=j<=i && t(d[j-1],j-1)<t(j,i))

这样从1到n一遍DP可以求出末尾最小的数

f[i]表示以i开头的最大的数的下标

f[i]=max(j) (i<=j<=n && t(i,j)<t(j+1,d[j+1]))

边界为f[d[n]]=n

这样从d[n]-1到1一遍DP可以求出开头最大的数,第二个最大的数。。。

注意前导0的情况

#include <cstdio>
#include <cstring>
#define N 1001 int n;
char s[N];
int d[N], f[N];
//d[i]表示以i结尾的数,满足条件的最小数
//f[i]表示以i开头的数,满足条件的最大数
//s[i][j]表示从i到j的数是多少 inline int cmp(int x1, int y1, int x2, int y2)
{
int i, j;
while(s[x1] == '0') x1++;
while(s[x2] == '0') x2++;
if(y1 - x1 == y2 - x2)
{
for(i = x1, j = x2; i <= y1; i++, j++)
{
if(s[i] > s[j]) return 1;
if(s[i] < s[j]) return 2;
}
return 0;
}
if(y1 - x1 > y2 - x2) return 1;
if(y1 - x1 < y2 - x2) return 2;
} int main()
{
int i, j, k;
scanf("%s", s + 1);
n = strlen(s + 1);
for(i = 1; i <= n; i++)
for(j = i; j >= 1; j--)
if(cmp(j, i, d[j - 1], j - 1) == 1)
{
d[i] = j;
break;
}
while(s[d[n] - 1] == '0') d[n]--;
for(i = d[n]; i <= n; i++) f[i] = n;
for(i = d[n] - 1; i >= 1; i--)
{
k = n;
for(j = i; j <= n; j++)
if(cmp(i, j, j + 1, f[j + 1]) == 2)
k = j;
f[i] = k;
}
if(cmp(1, n, d[n], n) == 0)
{
printf("%s", s + 1);
return 0;
}
j = 1;
while(j <= n)
{
for(i = j; i <= f[j]; i++)
printf("%c", s[i]);
j = f[j] + 1;
if(j <= n) putchar(',');
}
return 0;
}

  

[luoguP1415] 拆分数列(DP)的更多相关文章

  1. luoguP1415 拆分数列 [dp]

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

  2. P1415 拆分数列 DP

    传送门: 题意: 将一个数字串分成许多不同的小串,使得这些小串代表的数字严格递增,要求最后一个数字尽可能地小. 然后满足字典序尽可能大. 思路: 由于最后一个数字要尽可能地小,所以先处理出每个数的L[ ...

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

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

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

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

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

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

  6. 洛谷P1415 拆分数列

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

  7. BZOJ 2431: [HAOI2009]逆序对数列( dp )

    dp(i,j)表示1~i的全部排列中逆序对数为j的个数. 从1~i-1的全部排列中加入i, 那么可以产生的逆序对数为0~i-1, 所以 dp(i,j) = Σ dp(i-1,k) (j-i+1 ≤ k ...

  8. BZOJ2431:[HAOI2009]逆序对数列(DP,差分)

    Description 对于一个数列{ai},如果有i<j且ai>aj,那么我们称ai与aj为一对逆序对数.若对于任意一个由1~n自然数组成的 数列,可以很容易求出有多少个逆序对数.那么逆 ...

  9. P1415 拆分数列

    传送门 DP数列长度过大无法枚举,考虑DP设f1[i]储存以第i个字符为结尾时,的最后一个数最小时,这个数的开头的位置(很难想有木有)OK,状态有了,方程想一想就出来了:设$num[i][j]$为数列 ...

随机推荐

  1. MyEclipse中把java项目打包——含有第三方jar包【转】

    也适用于eclipse导出jar. 在将项目打包为jar包时一直出现“ClassNotDefFound”错误,百度了很多解决办法都没有解决.最终找到一个很好的解决办法. 1.打包步骤 (1)右键单击j ...

  2. VC操作WORD文档总结

    一.写在开头 最近研究word文档的解析技术,我本身是VC的忠实用户,看到C#里面操作WORD这么舒服,同时也看到单位有一些需求,就想尝试一下,结果没想到里面的技术点真不少,同时网络上的共享资料很多, ...

  3. office word excel等图标显示异常

    1.查看注册表:查看参数对应的路径被删除,计算机搜索新的文件路径更改路径即可.以此类推~ 计算机\HKEY_CLASSES_ROOT\Excel.Sheet.12\DefaultIcon 正常exce ...

  4. uiviewcontroller 键盘不遮挡信息

    //添加监听事件 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow: ...

  5. ios 使用NSRegularExpression解析正则表达式

    初始化一个   NSRegularExpression 对象 注:_str是要匹配的字符串 NSRegularExpression *regex = [NSRegularExpression regu ...

  6. Sublime 设置移动光标快捷键

    发现问题 在使用Sublime和其他编辑器一个很不爽的问题是:在输入一个函数或者有左右的符号或者在引号内时,总是要跳出来,无奈方向键又在主键盘的另一边,只能不断的切换,太特么操蛋,就不能让手指不离开主 ...

  7. 基于docker搭建wordpress博客网站平台

    WordPress是使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站.也可以把 WordPress当作一个内容管理系统(CMS)来使用. WordPre ...

  8. UEditor中多图上传的bug

    多图上传 预览:支持浏览器版本  IE8以上 在线管理:由于存在bug,显示不了 ueditor-1.1.1.jar解压后找到FileManager 1.修改com.baidu.ueditor.hun ...

  9. shelll脚本,根据软链接,找到真实路径

    [root@localhost tmp]# ls -l total lrwxrwxrwx root root Sep : abc -> /etc/passwd lrwxrwxrwx root r ...

  10. 数据库事务ACID和事务的隔离级别

    借鉴:https://blog.csdn.net/zh521zh/article/details/69400053和https://blog.csdn.net/May_3/article/detail ...