题目背景

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

题目描述

给出一列数字,需要你添加任意多个逗号将其拆成若干个严格递增的数。如果有多组解,则输出使得最后一个数最小的同时,字典序最大的解(即先要满足最后一个数最小;如果有多组解,则使得第一个数尽量大;如果仍有多组解,则使得第二个数尽量大,依次类推……)。

输入输出格式

输入格式:

共一行,为初始的数字。

输出格式:

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

输入输出样例

输入样例#1:

[1]
3456
[2]
3546
[3]
3526
[4]
0001
[5]
100000101
输出样例#1:

[1]
3,4,5,6
[2]
35,46
[3]
3,5,26
[4]
0001
[5]
100,000101

说明

【题目来源】

lzn改编

【数据范围】

对于10%的数据,输入长度<=5

对于30%的数据,输入长度<=15

对于50%的数据,输入长度<=50

对于100%的数据,输入长度<=500

解析:

进行两次dp第一次dp dp1[i] 表示以第i个数字为结尾的 1~i串的最小结尾串的开始长度

第二次dp dp2[i]表示 以第[i]个数字为开头的开始串的最大长度

然后很显然啊 先第一次找出后面最小的,然后去掉找出的最后的 dp第二次找出前面最大的依次输出即可

当然dp的时候要保持递增性,这个有很多细节,包括去0全0等

(思路及代码均来自candy博客)=.=代码还比他的丑

代码:

#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std; int n;
string s("#"),op;
int dp1[];
int dp2[];
int note[]; bool can(int l1,int r1,int l2,int r2)
// 其实这两个就是L1 ~R1的一个数字,L2 ~ R2的一个数字
//判断是否是严格递增
{
while(l1 <= r1 && note[l1] == )
{
if(l1 == r1)return false;
l1++;
}
while(l2 <= r2 && note[l2] == )
{
if(l2 == r2)return false;
l2++;
}
/**/
int len1 = r1 - l1 + ;
int len2 = r2 - l2 + ;
if(len1 < len2)return true;
if(len1 > len2)return false; for(int i = ;i < len1;i++)
{
if(note[l1 + i] == note[l2 + i])continue;
return note[l1 + i] < note[l2 + i];
}
return false;//都相同的情况下
} void dp()
{
for(int i = ;i <= n;i++)
{
dp1[i] = ; // 向前扩展最多一位(因为他没法不扩展,扩展就可能变大)
for(int j = i;j >= ;j--)
if(can(dp1[j - ],j - ,j,i)) //
{
dp1[i] = j;break;
}
} dp2[dp1[n]] = n;int zz = dp1[n];
while(note[zz - ] == )dp2[zz - ] = n,zz--; for(int i = dp1[n] - ;i >= ;i--)
{
for(int j = dp1[n] - ;j >= i;j--)
if(can(i,j,j+,dp2[j + ]))
{
dp2[i] = j;break;
}
} } int main()
{
cin >> op;
s += op;
n = s.size() - ;
for(int i = ;i <= n;i++)
note[i] = s[i] - '';
dp();
int now = ;
while(now <= n)
{
if(now != )printf(",");
for(int i = now;i <= dp2[now];i++)printf("%d",note[i]);
now = dp2[now] + ; }
return ;
}

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

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

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

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

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

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

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

  4. [洛谷P3228] [HNOI2013]数列

    洛谷题目链接:[HNOI2013]数列 题目描述 小T最近在学着买股票,他得到内部消息:F公司的股票将会疯涨.股票每天的价格已知是正整数,并且由于客观上的原因,最多只能为N.在疯涨的K天中小T观察到: ...

  5. 【洛谷 P1667】 数列 (贪心)

    题目链接 对于一个区间\([x,y]\),设这个区间的总和为\(S\) 那么我们在前缀和(设为\(sum[i]\))的意义上考虑到原操作其实就是\(sum[x−1]+=S\) , \(sum[x]+S ...

  6. P1415 拆分数列

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

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

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

  8. 洛谷 P2401 不等数列 题解

    每日一题 day25 打卡 Analysis dp[i][j]=dp[i-1][j-1]*(i-j)+dp[i-1][j]*(j+1); 其中i和j是表示前i个数中有j个小于号,j<=i-1 要 ...

  9. 洛谷 P2401 不等数列

    其实有两种方法来解这道题# 第一种:找规律(非正经) 一看,这玩意像是个杨辉三角,还左右对称呢 因为新插入一个数$n$,有$n+1$个位置可以选,所以总数就乘$n+1$,对应的$f[n+1][i]$也 ...

随机推荐

  1. 6.1 socket 长连接、短连接

    一般情况下,服务器的长连接和短连接不是服务器说了算,而是客户端说了算.因为服务器是给别人提供业务的,一旦连接建立起来之后,服务器端不会主动把连接给close掉. 客户端发送一笔业务,没有关闭连接,然后 ...

  2. 常用增强学习实验环境 II (ViZDoom, Roboschool, TensorFlow Agents, ELF, Coach等) (转载)

    原文链接:http://blog.csdn.net/jinzhuojun/article/details/78508203 前段时间Nature上发表的升级版Alpha Go - AlphaGo Ze ...

  3. C高级第一次PTA作业 要求三

    要求一.要求二 内容链接:http://www.cnblogs.com/X-JY/p/8550457.html 一.PTA作业中的知识点总结 1.6-1 计算两数的和与差(10 分) (1)*在程序中 ...

  4. UVA 10305:Ordering Tasks(拓扑排序)

    #include <stdio.h> #include <string.h> #include <iostream> #include <algorithm& ...

  5. DOS命令下使用sqlite3 命令中文乱码的解决办法

    windows cmd窗口无法显示中文,不一定数据库中存储的就是乱码——多数情况只是显示问题,可以通过以下方式解决: 1.退出dos 或者重新开启在CMD窗口,输下:chcp 65001 然后回车确定 ...

  6. sql serve 创建序列

    Oracle中有sequence的功能,SQL Server类似的功能使用Identity列实现,但是有很大的局限性. 在2012中,微软终于增加了 sequence 对象,功能和性能都有了很大的提高 ...

  7. 什么是Base64算法?什么情况下用Base64算法?

    base64 编码的本质:将 8bit 二进制数转化为 6bit 的可打印字符. Base64编码用于需要将二进制数据转为文本数据进行储存和传输的场景. Javascript内部的字符串,都以utf- ...

  8. php实现cookie加密解密

    1.加密解密类 class Mcrypt { /** * 解密 * * @param string $encryptedText 已加密字符串 * @param string $key 密钥 * @r ...

  9. Openwrt编译时修改默认IP的方法

    在~/openwrt/barrier_breaker/package/base-files/files/lib/functions/ uci-defaults.sh 第178行修改IP地址

  10. python列表中的pop

    pop()将列表指定位置的元素移除,同时可以将移除的元素赋值给某个变量,不填写位置参数则默认删除最后一位. pop()根据键将字典中指定的键值对删除,同时可以将删除的值赋值给变量. a = [1, 2 ...