传送门

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的情况

  1. #include <cstdio>
  2. #include <cstring>
  3. #define N 1001
  4.  
  5. int n;
  6. char s[N];
  7. int d[N], f[N];
  8. //d[i]表示以i结尾的数,满足条件的最小数
  9. //f[i]表示以i开头的数,满足条件的最大数
  10. //s[i][j]表示从i到j的数是多少
  11.  
  12. inline int cmp(int x1, int y1, int x2, int y2)
  13. {
  14. int i, j;
  15. while(s[x1] == '0') x1++;
  16. while(s[x2] == '0') x2++;
  17. if(y1 - x1 == y2 - x2)
  18. {
  19. for(i = x1, j = x2; i <= y1; i++, j++)
  20. {
  21. if(s[i] > s[j]) return 1;
  22. if(s[i] < s[j]) return 2;
  23. }
  24. return 0;
  25. }
  26. if(y1 - x1 > y2 - x2) return 1;
  27. if(y1 - x1 < y2 - x2) return 2;
  28. }
  29.  
  30. int main()
  31. {
  32. int i, j, k;
  33. scanf("%s", s + 1);
  34. n = strlen(s + 1);
  35. for(i = 1; i <= n; i++)
  36. for(j = i; j >= 1; j--)
  37. if(cmp(j, i, d[j - 1], j - 1) == 1)
  38. {
  39. d[i] = j;
  40. break;
  41. }
  42. while(s[d[n] - 1] == '0') d[n]--;
  43. for(i = d[n]; i <= n; i++) f[i] = n;
  44. for(i = d[n] - 1; i >= 1; i--)
  45. {
  46. k = n;
  47. for(j = i; j <= n; j++)
  48. if(cmp(i, j, j + 1, f[j + 1]) == 2)
  49. k = j;
  50. f[i] = k;
  51. }
  52. if(cmp(1, n, d[n], n) == 0)
  53. {
  54. printf("%s", s + 1);
  55. return 0;
  56. }
  57. j = 1;
  58. while(j <= n)
  59. {
  60. for(i = j; i <= f[j]; i++)
  61. printf("%c", s[i]);
  62. j = f[j] + 1;
  63. if(j <= n) putchar(',');
  64. }
  65. return 0;
  66. }

  

[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. CSS实现画一条竖线

    在开发中遇到一种需求:画一条竖线. 横线倒是很好画,直接<hr/>就可以了.但是竖线没有这么现成的标签,囧囧囧~ 在网上搜索了很多资料,莫衷一是,也没有什么可信的结果. 1.原来这就是竖线 ...

  2. js获取元素的页面坐标

    一.DOM中各种宽度.高度 二.DOM中的坐标系 JS获取div元素的宽度 offsetWidth=width+padding-left+padding-right+border-left+borde ...

  3. 对InitialContext的理解

        类InitialContext java.lang.Object   javax.naming.InitialContext 此类是执行命名操作的初始上下文. 所有命名操作都相对于某一上下文. ...

  4. GP SQL 优化

    1.收集统计信息vacuum full analyze ZCXT.ZCOT_PS_PROJECT; 2.检查表的数据量分布select gp_segment_id,count(*) from fact ...

  5. COGS 2688. 鱼的感恩

    ★   输入文件:fool.in   输出文件:fool.out   简单对比时间限制:1 s   内存限制:256 MB [题目描述] 从前有一个渔夫抓到了一条特别的鱼,放走了. 渔夫再次抓到了这条 ...

  6. 洛谷 P1009 阶乘之和

    题目描述 用高精度计算出S=1!+2!+3!+…+n!(n≤50) 其中“!”表示阶乘,例如:5!=5*4*3*2*1. 输入输出格式 输入格式: 一个正整数N. 输出格式: 一个正整数S,表示计算结 ...

  7. (十一)maven之安装nexus私服

    安装nexus私服 前面的文章中对项目引入jar依赖包的时候,maven一般先是在本地仓库找对应版本的jar依赖包,如果在本地仓库中找不到,就上中央仓库中下载到本地仓库. 然而maven默认提供的中央 ...

  8. 如何找到SAP Cloud for Customer标准培训和认证方面的信息

    有一些朋友询问我如何在SAP官网上找到和SAP Cloud for Customer相关的标准培训信息,我这里把步骤写出来: 登录SAP官网https://training.sap.com 输入和Cl ...

  9. 图片,二进制,oracle数据库

    图片在oracle数据库中一般以二进制存在,存储类型是blob,然而clob类型一般存储的是大于4000的字符,不能用来存储图像这样的二进制内容,下面展示一下实现图像,二进制,oracle 数据库的应 ...

  10. POJ2402 Palindrome Numbers第K个回文数——找规律

    问题 给一个数k,给出第k个回文数  链接 题解 打表找规律,详见https://www.cnblogs.com/lfri/p/10459982.html,差别仅在于这里从1数起. AC代码 #inc ...