传送门

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

如果$num[ j ][ i ]>num[ f1[ j -1 ] ][ j-1 ]$( $j$$i$到1 ,$1<=i<=len$)则$f1[ i ]$等于$j$,并且直接退出当前循环
因为$j$从后往前枚举,所以一旦找到符合的j就是$num[ f1[ i ] ][ i ]$的最小值
至于$num$的判断只要打个暴力循环就好了..数据太小..
然后是输出字典序最小的答案(划重点)
仍然是DP..
设$f2[i]$存储以第i个字符为开头时,的最后一个数最小时,这个数的结尾的位置(貌似只是倒过来了..)
同样如果$num[i][j]<num[j+1][f2[j+1]]$( $j$从$n$到$i$,$i$从$n$到$1$)则$f2[i]$等于$j$,并且直接退出当前循环.
还有$f2[f[len]]$初始为$len$
有一点要注意最后一个数可以有前导0..
"如果第一次dp计算出最小末尾为50,但输入是……00050。

这样上面的转移方程不会将000和50分成一组,因为I≤j≤f[n] 。

这样000所在状态就和状态定义不符,它没表示出最大末尾。"

                      __by Rapiz
所以要先把最后一个数的前导0单独处理
听同机房的dalao说好像数据可以扩10倍,判断的话就要用神奇的后缀数组什么的..我也不清楚唉

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
char s[];
int n,f1[],f2[];
inline bool pd(int la,int ra,int lb,int rb)//暴力的判断函数
{
while(s[la]==&&la<ra) la++;
while(s[lb]==&&lb<rb) lb++;
//cout<<la<<" "<<ra<<" "<<lb<<" "<<rb<<endl;
if(ra-la!=rb-lb)
{
if(ra-la>rb-lb) return ;
else return ;
}
int len=ra-la;
//cout<<len<<endl;
//printf("%d %d",s[la+0],s[lb+0]);
//cout<<endl;
for(int i=;i<=len;i++)
if(s[la+i]!=s[lb+i])
return s[la+i]>s[lb+i];
return ;
}
int main()
{
scanf("%s",s+);
for(int i=;s[i];i++,n++) s[i]-='';
//DP开始
for(int i=;i<=n;i++)
{
for(int j=i;j>;j--)
if(pd(j,i,f1[j-],j-))
{
f1[i]=j;
break;
}
}
int tot=;
//cout<<f1[n];
for(int i=f1[n]-;i&&s[i]==;i--) f2[i]=n,tot++;
f2[f1[n]]=n;
for(int i=f1[n]-tot;i>;i--)
{
f2[i]=i;
for(int j=f1[n]-;j>=i;j--)
if(pd(j+,f2[j+],i,j))
{
f2[i]=max(f2[i],j);
break;
}
}
int pos=f2[];
for(int i=;i<=n;i++)
{
if(i==pos&&i!=n)
{
printf("%d,",s[i]);
pos=f2[i+];
continue;
}
printf("%d",s[i]);
}
return ;
}

P1415 拆分数列的更多相关文章

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

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

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

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

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

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

  4. 洛谷P1415 拆分数列

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

  5. P1415 拆分数列 DP

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

  6. luoguP1415 拆分数列 [dp]

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

  7. [luoguP1415] 拆分数列(DP)

    传送门 t(i,j)表示下标从i到j的数 d[i]表示以i结尾的最小的数的下标 d[i]=max(j) (1<=j<=i && t(d[j-1],j-1)<t(j,i ...

  8. luogu1415 拆分数列

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

  9. Codeforces 950 010子序列拆分 数列跳棋

    A B a,b两个序列分成K段 每一段的值相等 #include <bits/stdc++.h> #define PI acos(-1.0) #define mem(a,b) memset ...

随机推荐

  1. TCP/IP 笔记 1.1 概 述

    四个层次 每一层负责不同的功能:1) 链路层,有时也称作数据链路层或网络接口层,通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡.它们一起处理与电缆(或其他任何传输媒介)的物理接口细节.2) ...

  2. maven 配置说明

    1.坐标 1.1 每一jar文件都有一个唯一坐标.通过坐标可以精确确定是哪个jar 1.2 坐标组成 1.2.1 Group ID : 公司名.公司网址倒写 1.2.2 Artifact ID : 项 ...

  3. MySQL数据库规范

    Mysql数据库规范 一.基础规范 [强制]使用InnoDB存储引擎解读:InnoDB存储引擎是MySQL默认存储引擎,支持事务和行级锁,并发性能更好,CPU及内存缓存页优化使得资源利用率更高[强制] ...

  4. const 和 #define区别

    (1) 编译器处理方式不同 define宏是在预处理阶段展开. const常量是编译运行阶段使用. (2) 类型和安全检查不同 define宏没有类型,不做任何类型检查,仅仅是展开. const常量有 ...

  5. Luogu 4139 上帝与集合的正确用法

    扩展欧拉定理:$a^{b} \equiv a^{b Mod \varphi  (p) + \varphi  (p)}  (Mod  p)  $ $(b \geq \varphi (p))$ . 这道题 ...

  6. Swing窗口Linux下不支持最大化问题

    Swing窗口Linux下不支持最大化问题 摘自:https://www.linuxidc.com/Linux/2009-06/20519.htm [日期:2009-06-17] 来源:www.qua ...

  7. html 连接数据库

    http://blog.csdn.net/haxker/article/details/4214001 http://www.cnblogs.com/chuncn/archive/2010/11/22 ...

  8. Android 实现形态各异的双向侧滑菜单 自定义控件来袭(转载)

    1.概述 关于自定义控件侧滑已经写了两篇了~~今天决定把之前的单向改成双向,当然了,单纯的改动之前的代码也没意思,今天不仅会把之前的单向改为双向,还会多添加一种侧滑效果,给大家带来若干种形态各异的双向 ...

  9. 通过shell脚本开始和结束守护进程

    //关闭脚本 #!/bin/sh WHOAMI=`whoami` PID=`ps -u $WHOAMI | grep 守护进程名 | awk '{print $1}'` if (用户名 "$ ...

  10. angular 分页

    http://jsfiddle.net/SAWsA/11/# <html xmlns:ng="http://angularjs.org" ng-app lang=" ...