拆分数列 洛谷p1415
来源:互联网 发布:淘宝抢购秒杀快速付款 编辑:程序博客网 时间:2024/05/22 17:14
题目背景
【为了响应党中央勤节俭、反铺张的精神,题目背景描述故事部分略去^-^】
题目描述
给出一列数字,需要你添加任意多个逗号将其拆成若干个严格递增的数。如果有多组解,则输出使得最后一个数最小的同时,字典序最大的解(即先要满足最后一个数最小;如果有多组解,则使得第一个数尽量大;如果仍有多组解,则使得第二个数尽量大,依次类推……)。
输入输出格式
输入格式:共一行,为初始的数字。
输出格式:共一行,为拆分之后的数列。每个数之间用逗号分隔。行尾无逗号。
输入输出样例
[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
第一步先求出最后的那个数最小为多少。(为了叙述方便,记T(i,j)表示从原数列下标i取到j的数字组成的数。)只需正向dp一次,dp1[i]表示前i个数字分成任意多个递增数且最后的数最小时,最后的数为T(dp1[i],i)。则dp1[i]=max(j),(T(dp1[j-1],j-1)<T(j,i))。
第二步要求最后一个数确定的情况下,前面的数字按字典序尽量大的解。类似上面的方法反向动归一次即可。
算法复杂度o(l^3)。由于数据大部分为随机,实际运行效率接近l^2。
1.字符串比较处理前导0,并且我在遇到全0串时返回了false,因为这样的划分不合法
2.初始化d[i]=1
3.第一次95分,有一个数据1234050,我的程序无法把050划分成一个
解决措施是把最后一个数前面的前导0的f值都指向n
经验:
1.分两步求解
2.非常特别的状态表示,无法直接保存数的大小,所以保存序列中下标
3.字符处理成数字注意前导0,不能将0划分为一个数字,因为若0在中间,则前面不必须是负数,这不可能,若0在前面,则肯定不是字典序最大
#include<iostream>#include<string>#include<cstdio>#include<cstring>#include<cstdlib>#define f(i,l,r) for(i=(l);i<=(r);i++)#define ff(i,r,l) for(i=(r);i>=(l);i--)using namespace std;const int MAXN=505;char ch[MAXN];int l,d[MAXN],f[MAXN],a[MAXN];inline bool cmp(int l1,int r1,int l2,int r2){int i;while(l1<=r1&&!a[l1]) l1++;while(l2<=r2&&!a[l2]) l2++;if(l1>r1||l2>r2) return 0;if(r1-l1>r2-l2) return 0;if(r1-l1<r2-l2) return 1;f(i,0,r1-l1){if(a[l1+i]<a[l2+i]) return 1;if(a[l1+i]>a[l2+i]) return 0;}return 0;}inline void dp1(){int i,j;f(i,1,l){d[i]=1;ff(j,i,2){if(cmp(d[j-1],j-1,j,i)){d[i]=j;break;}}}}inline void dp2(){int i,j,k;f[d[l]]=l;for(k=d[l];!a[k-1];k--){f[k-1]=l;}ff(i,k-1,1){ff(j,d[l]-1,i){if(cmp(i,j,j+1,f[j+1])){f[i]=j;break;}}}}int main(){int i,j,pos=1,flag=0;scanf("%s",ch+1);l=strlen(ch+1);f(i,1,l)a[i]=ch[i]-'0';dp1();dp2();while(pos<=l){if(flag) cout<<',';flag=1;f(i,pos,f[pos]){cout<<a[i];}pos=f[pos]+1;}return 0;}
- 洛谷P1415 拆分数列
- 拆分数列 洛谷p1415
- 动规-洛谷P1415 拆分数列
- P1415 拆分数列
- 拆分数列
- luoguP1415 拆分数列
- 递归 - 整数拆分为斐波拉契数列的和
- 拆分
- 【BZOJ】【P1415】【Noi2005】【聪聪和可可】【题解】【期望DP】
- 洛谷 P1062 数列
- 洛谷 P2401 不等数列
- 洛谷 P2401 不等数列
- 洛谷 P1062 数列
- 洛谷 P2401 不等数列
- 数列分段-洛谷 1181
- 洛谷P1181 数列分段
- 洛谷 P1062 数列
- 洛谷 P2042 维护数列
- js 获取url参数
- 边框阴影的练习
- samba服务
- 佛洛依德冰山原理
- epoll 基础API
- 拆分数列 洛谷p1415
- [My SQL] 使用子查询
- 利用Android Studio 将moudle变成jar包
- 记 BUG: unable to handle kernel paging requrest at 0xffff7fXXXXXXXXX
- 使用maven+springmvc+POI对上传的Excel文件进行解析并操作
- FTP服务器搭建与权限配置
- 8球胜负(eight)
- html笔记
- PHP使用极光推送