洛谷P1415 拆分数列
题目背景
【为了响应党中央勤节俭、反铺张的精神,题目背景描述故事部分略去^-^】
题目描述
给出一列数字,需要你添加任意多个逗号将其拆成若干个严格递增的数。如果有多组解,则输出使得最后一个数最小的同时,字典序最大的解(即先要满足最后一个数最小;如果有多组解,则使得第一个数尽量大;如果仍有多组解,则使得第二个数尽量大,依次类推……)。
输入输出格式
输入格式:
共一行,为初始的数字。
输出格式:
共一行,为拆分之后的数列。每个数之间用逗号分隔。行尾无逗号。
输入输出样例
- [1]
- 3456
- [2]
- 3546
- [3]
- 3526
- [4]
- 0001
- [5]
- 100000101
- [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 拆分数列的更多相关文章
- 洛谷P1415 拆分数列[序列DP 状态 打印]
题目背景 [为了响应党中央勤节俭.反铺张的精神,题目背景描述故事部分略去^-^] 题目描述 给出一列数字,需要你添加任意多个逗号将其拆成若干个严格递增的数.如果有多组解,则输出使得最后一个数最小的同时 ...
- 洛谷 P1415 拆分数列 解题报告
拆分数列 题目背景 [为了响应党中央勤节俭.反铺张的精神,题目背景描述故事部分略去^-^] 题目描述 给出一列数字,需要你添加任意多个逗号将其拆成若干个严格递增的数. 如果有多组解,则输出使得最后一个 ...
- 洛谷P1415 拆分数列(dp)
题目链接:传送门 题目: 题目背景 [为了响应党中央勤节俭.反铺张的精神,题目背景描述故事部分略去^-^] 题目描述 给出一列数字,需要你添加任意多个逗号将其拆成若干个严格递增的数.如果有多组解,则输 ...
- [洛谷P3228] [HNOI2013]数列
洛谷题目链接:[HNOI2013]数列 题目描述 小T最近在学着买股票,他得到内部消息:F公司的股票将会疯涨.股票每天的价格已知是正整数,并且由于客观上的原因,最多只能为N.在疯涨的K天中小T观察到: ...
- 【洛谷 P1667】 数列 (贪心)
题目链接 对于一个区间\([x,y]\),设这个区间的总和为\(S\) 那么我们在前缀和(设为\(sum[i]\))的意义上考虑到原操作其实就是\(sum[x−1]+=S\) , \(sum[x]+S ...
- P1415 拆分数列
传送门 DP数列长度过大无法枚举,考虑DP设f1[i]储存以第i个字符为结尾时,的最后一个数最小时,这个数的开头的位置(很难想有木有)OK,状态有了,方程想一想就出来了:设$num[i][j]$为数列 ...
- 洛谷 P2609 [ZJOI2012]数列 解题报告
P2609 [ZJOI2012]数列 题目描述 小白和小蓝在一起上数学课,下课后老师留了一道作业,求下面这个数列的通项公式: A(0)=0 A(1)=1 A(2i)=A(i) (对于任意 i>0 ...
- 洛谷 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 要 ...
- 洛谷 P2401 不等数列
其实有两种方法来解这道题# 第一种:找规律(非正经) 一看,这玩意像是个杨辉三角,还左右对称呢 因为新插入一个数$n$,有$n+1$个位置可以选,所以总数就乘$n+1$,对应的$f[n+1][i]$也 ...
随机推荐
- Android Gradle 理解
/********************************************************************************* * Android Gradle ...
- TX2-start 6 CPU kernel-开启高功耗模式
1.TX2简介 Jetson TX2是由一个GPU和一个CPU集群组成.CPU集群由双核denver2处理器和四核ARM Cortex-A57组成,通过高性能互连架构连接.拥有6个CPU核心和一个GP ...
- python绘制树枝
python是解释型语言,下面的程序深刻的说明了这个问题. import turtle def branch(length,level): if level<=0: return turtle. ...
- 【NOI2003】银河英雄传
迭代不一定比递归好 原题: 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星 ...
- 使用jsonp进行跨站点数据访问
使用jsonp 可以解决ajax 的跨域问题,使用起来比较简单. 具体的测试环境搭建如下 1.一个简单的MVC 站点 2.一个简单的html文件(这次的测试是在web 站点中,当然可以是一个简单的ht ...
- Python–logging模块知多少
我们在写程序的时候经常会打一些日志来帮助我们查找问题,这次学习一下logging模块,在python里面如何操作日志. 介绍一下logging模块,logging模块就是python里面用来操作日志的 ...
- 【转】Ubuntu12.04 LTS下环境变量设置
原文网址:http://blog.chinaunix.net/uid-26963688-id-3221439.html 1.设置当前用户环境变量(对root用户无效) 打开终端输入:light@cha ...
- 如何调试触发器-MSSQL (转帖)
调试触发器 //------------------------------------- 作者:四海为圈(原创) //------------------------------------- 1. ...
- elastic-job 分布式定时任务框架 在 SpringBoot 中如何使用(一)初始化任务并定时执行
第一篇需要实现一个最简单的需求:某个任务定时执行,多台机子只让其中一台机子执行任务 一.安装 分布式应用程序协调服务 zookeeper,安装步骤在链接里面 Linux(Centos7)下安装 zoo ...
- 【shell】sed命令
sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换.删除.新增.选取等特定工作,下面先了解一下sed的用法sed命令行格式为: sed ...