拆分数列

题目背景

【为了响应党中央勤节俭、反铺张的精神,题目背景描述故事部分略去-

题目描述

给出一列数字,需要你添加任意多个逗号将其拆成若干个严格递增的数。

如果有多组解,则输出使得最后一个数最小的同时,字典序最大的解(即先要满足最后一个数最小;如果有多组解,则使得第一个数尽量大;如果仍有多组解,则使得第二个数尽量大,依次类推……)。

输入输出格式

输入格式:

共一行,为初始的数字。

输出格式:

共一行,为拆分之后的数列。每个数之间用逗号分隔。行尾无逗号。

数据范围

对于\(10\%\)的数据,输入长度\(\le5\)

对于\(30\%\)的数据,输入长度\(\le15\)

对于\(50\%\)的数据,输入长度\(\le50\)

对于\(100\%\)的数据,输入长度\(\le500\)


这个题还挺巧妙的。

发现要求是字典序构造,而且两组要求看起来不太一样。

考虑分开做,先在保证有解的情况下找到最后一个最小的数。

令\(dp_i\)代表以\(i\)为结束时的字符串的最大前缀位置(即满足最后一位最小),这样我们每次找的都是最小的位,具有最优子结构性质。

转移:

$$dp_i=max_{num_{j,i}>num_{dp_{j-1},j-1},j\le i} \ j$$

\(num_{i,j}\)代表从\(i\)到\(j\)的数字大小

注意比较的复杂度,所以总体是\(O(n^3)\)的,不过上界非常松

然后我们再反着做一遍类似的\(DP\),发现还是由最大前缀推了最大前缀的,所以刚好满足了要求\(2\)

注意前导\(0\)的一些特判


Code:

#include <cstdio>
#include <cstring>
const int N=502;
int n,dp[N];
char s[N];
bool check(int l1,int r1,int l2,int r2)//前是否大于后
{
if(r2==0) return 1;
while(s[l1]=='0'&&l1<=r1) ++l1;
while(s[l2]=='0'&&l2<=r2) ++l2;
if(r1-l1>r2-l2) return 1;
else if(r1-l1<r2-l2) return 0;
while(l1<=r1&&l2<=r2&&s[l1]==s[l2]) ++l1,++l2;
return s[l1]>s[l2];
}
int main()
{
scanf("%s",s+1);
n=strlen(s+1);
for(int i=1;i<=n;i++)
for(int j=i;j;j--)
if(check(j,i,dp[j-1],j-1))
{
dp[i]=j;
break;
}
int d=dp[n],pos=dp[n];
memset(dp,0,sizeof(dp));
dp[pos]=n;
while(s[pos-1]=='0') --pos,dp[pos]=n;
for(int i=pos-1;i;i--)
for(int j=d;j>=i;j--)
if(check(j+1,dp[j+1],i,j))
{
dp[i]=j;
break;
}
for(int l=1,r;l<=n;l=r+1)
{
r=dp[l];
for(int j=l;j<=r;j++) printf("%c",s[j]);
if(r!=n) printf(",");
}
return 0;
}

2018.10.21

洛谷 P1415 拆分数列 解题报告的更多相关文章

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

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

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

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

  3. 洛谷P1415 拆分数列

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

  4. 洛谷 P2609 [ZJOI2012]数列 解题报告

    P2609 [ZJOI2012]数列 题目描述 小白和小蓝在一起上数学课,下课后老师留了一道作业,求下面这个数列的通项公式: A(0)=0 A(1)=1 A(2i)=A(i) (对于任意 i>0 ...

  5. 洛谷 P4597 序列sequence 解题报告

    P4597 序列sequence 题目背景 原题\(\tt{cf13c}\)数据加强版 题目描述 给定一个序列,每次操作可以把某个数\(+1\)或\(-1\).要求把序列变成非降数列.而且要求修改后的 ...

  6. 洛谷 P1783 海滩防御 解题报告

    P1783 海滩防御 题目描述 WLP同学最近迷上了一款网络联机对战游戏(终于知道为毛JOHNKRAM每天刷洛谷效率那么低了),但是他却为了这个游戏很苦恼,因为他在海边的造船厂和仓库总是被敌方派人偷袭 ...

  7. 洛谷1087 FBI树 解题报告

    洛谷1087 FBI树 本题地址:http://www.luogu.org/problem/show?pid=1087 题目描述 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全 ...

  8. 洛谷 P2467 地精部落 解题报告

    P2467 [SDOI2010]地精部落 题目描述 传说很久以前,大地上居住着一种神秘的生物:地精. 地精喜欢住在连绵不绝的山脉中.具体地说,一座长度为\(N\)的山脉\(H\)可分为从左到右的\(N ...

  9. 洛谷 P4128 [SHOI2006]有色图 解题报告

    P4128 [SHOI2006]有色图 题目描述 如果一张无向完全图(完全图就是任意两个不同的顶点之间有且仅有一条边相连)的每条边都被染成了一种颜色,我们就称这种图为有色图.如果两张有色图有相同数量的 ...

随机推荐

  1. 【Laravel】查询构造器---使用orWhere的顺序对查询结果产生的不良影响

    实现查询:获取模糊匹配中文名 || 英文名等于 “Sara” 并且 个人信息状态为“待审核” 的员工信息. 其中 $filter = ["eName" => "Sa ...

  2. 理解HBase

    1.HBase HBase: Hadoop Database,根据Google的Big Table设计 HBase是一个分布式.面向列族的开源数据库.HDFS为Hbase提供了底层的数据存储服务,Ma ...

  3. PHP json_decode返回null解析失败原因

    在PHP5.4之前 json_decode函数有两个参数json_decode有两个参数,第一个是待解析的字符串,第二个是是否解析为Array json_decode要求的字符串比较严格:(1)使用U ...

  4. ESP32 LyraT音频开发板试玩(一):搭建开发环境

    我是卓波,很高兴你来看我的博客. 系列文章: ESP32 LyraT音频开发板试玩(一):搭建开发环境 ESP32 LyraT音频开发板试玩(二):播放音乐 关于ESP32的开发环境搭建,官方有教程, ...

  5. Python3 函数参数

    # # 常规参数 # def jiafa(a,b): # print(a+b) # # jiafa(5,6) # # # def xinxi(name,location,sex='male'): # ...

  6. python2.7入门---变量类型&案例

      这篇文章呢,主要是用来记录python中的变量类型学习内容的.接下来就来看一下变量类型,那么什么是变量呢.变量存储在内存中的值.这就意味着在创建变量时会在内存中开辟一个空间.基于变量的数据类型,解 ...

  7. Yearning和inception搭建MySQL审核平台

    前言 采用开源Yearning和inception开源软件,搭建用于MYSQL审核及线上MYSQL语句更新的审核平台. 功能说明 Yearning: 基于Vue.js与Django的整套mysql-s ...

  8. JavaScript---设计模式简介

    概念 设计模式(Design pattern)是一套被反复使用.思想成熟.经过分类和无数次实战设计经验的总结的.使用设计模式是为了让系统代码可重用.可扩展.可解耦.更容易被人理解且能保证代码的可靠性. ...

  9. 用 Qt 控制 Nikon 显微镜的电动物镜转盘

    用 Qt 控制 Nikon 显微镜的电动物镜转盘 最近的一个项目,用到了一台 Nikon 的金相显微镜,并且配了个电动的物镜转盘.为了控制这个电动物镜转盘,我折腾了差不多有4-5天.中间遇到了各种问题 ...

  10. CentOS 7 安装Nginx并实现域名转发

    CentOS 7 条件 教程中的步骤需要root用户权限. 一.添加Nginx到YUM源 添加CentOS 7 Nginx yum资源库,打开终端,使用以下命令: sudo rpm -Uvh http ...