luogu1415 拆分数列
题目大意
给出一列数字,需要你添加任意多个逗号将其拆成若干个严格递增的数。如果有多组解,则输出使得最后一个数最小的同时,字典序最大的解(即先要满足最后一个数最小;如果有多组解,则使得第一个数尽量大;如果仍有多组解,则使得第二个数尽量大,依次类推……)。
题解
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int MAX_N = 510;
int A[MAX_N];
int F1[MAX_N], F2[MAX_N], AnsF2[MAX_N];
int N; void CharToA(char *s)
{
N = strlen(s + 1);
for (int i = 1; i <= N; i++)
A[i] = s[i] - '0';
} bool RangeLt(int l1, int r1, int l2, int r2)
{
while (A[l1] == 0 && l1 <= r1)
l1++;
while (A[l2] == 0 && l2 <= r2)
l2++;
if (r1 - l1 != r2 - l2)
return r1 - l1 < r2 - l2;
else
for (int i = 0; i <= r1 - l1; i++)
if (A[l1 + i] != A[l2 + i])
return A[l1 + i] < A[l2 + i];
return false;
} void DP1()
{
for (int i = 1; i <= N; i++)
F1[i] = 1;
for (int i = 1; i <= N; i++)
for (int j = 2; j <= i; j++)
if (RangeLt(F1[j - 1], j - 1, j, i))
F1[i] = j;
} void DP2(int ed)
{
memset(F2, 0, sizeof(F2));
F2[ed] = N;
for (int i = ed - 1; i >= 1; i--)
for (int j = i; j <= ed - 1; j++)
if (RangeLt(i, j, j + 1, F2[j + 1]))
F2[i] = j;
} bool CmpF2()
{
int cur = 1;
while (cur <= N)
{
if (F2[cur] != AnsF2[cur])
return F2[cur] > AnsF2[cur];
cur = F2[cur] + 1;
}
return false;
} void Print()
{
int cur = 1;
bool tag = false;
while (cur <= N)
{
if (tag)
putchar(',');
tag = true;
for (int i = cur; i <= AnsF2[cur]; i++)
putchar('0' + A[i]);
cur = AnsF2[cur] + 1;
}
} int main()
{
char s[MAX_N];
scanf("%s", s + 1);
CharToA(s);
DP1();
DP2(F1[N]);
memcpy(AnsF2, F2, sizeof(F2));
for (int i = F1[N] - 1; A[i] == 0; i--)
{
if (!RangeLt(F1[i - 1], i - 1, i, N))
break;
DP2(i);
if (CmpF2())
memcpy(AnsF2, F2, sizeof(F2));
}
Print();
return 0;
}
luogu1415 拆分数列的更多相关文章
- 洛谷P1415 拆分数列[序列DP 状态 打印]
题目背景 [为了响应党中央勤节俭.反铺张的精神,题目背景描述故事部分略去^-^] 题目描述 给出一列数字,需要你添加任意多个逗号将其拆成若干个严格递增的数.如果有多组解,则输出使得最后一个数最小的同时 ...
- 洛谷 P1415 拆分数列 解题报告
拆分数列 题目背景 [为了响应党中央勤节俭.反铺张的精神,题目背景描述故事部分略去^-^] 题目描述 给出一列数字,需要你添加任意多个逗号将其拆成若干个严格递增的数. 如果有多组解,则输出使得最后一个 ...
- luoguP1415 拆分数列 [dp]
题目描述 给出一列数字,需要你添加任意多个逗号将其拆成若干个严格递增的数.如果有多组解,则输出使得最后一个数最小的同时,字典序最大的解(即先要满足最后一个数最小:如果有多组解,则使得第一个数尽量大:如 ...
- 洛谷P1415 拆分数列(dp)
题目链接:传送门 题目: 题目背景 [为了响应党中央勤节俭.反铺张的精神,题目背景描述故事部分略去^-^] 题目描述 给出一列数字,需要你添加任意多个逗号将其拆成若干个严格递增的数.如果有多组解,则输 ...
- 洛谷P1415 拆分数列
题目背景 [为了响应党中央勤节俭.反铺张的精神,题目背景描述故事部分略去^-^] 题目描述 给出一列数字,需要你添加任意多个逗号将其拆成若干个严格递增的数.如果有多组解,则输出使得最后一个数最小的同时 ...
- P1415 拆分数列
传送门 DP数列长度过大无法枚举,考虑DP设f1[i]储存以第i个字符为结尾时,的最后一个数最小时,这个数的开头的位置(很难想有木有)OK,状态有了,方程想一想就出来了:设$num[i][j]$为数列 ...
- [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 ...
- P1415 拆分数列 DP
传送门: 题意: 将一个数字串分成许多不同的小串,使得这些小串代表的数字严格递增,要求最后一个数字尽可能地小. 然后满足字典序尽可能大. 思路: 由于最后一个数字要尽可能地小,所以先处理出每个数的L[ ...
- Codeforces 950 010子序列拆分 数列跳棋
A B a,b两个序列分成K段 每一段的值相等 #include <bits/stdc++.h> #define PI acos(-1.0) #define mem(a,b) memset ...
随机推荐
- Cookie localStorage sessionStorage
三者的异同 特性 Cookie localStorage sessionStorage 数据的生命期 可设置失效时间,默认是关闭浏览器后失效 除非被清除,否则永久保存 仅在当前会话下(tab标签页)有 ...
- [ JSOI 2015 ] Salesman
\(\\\) \(Description\) 给出一棵以\(1\)为根的\(N\)个节点的树,开始的时候你在\(1\)号节点. 除了\(1\)号节点以外,每个点都有访问次数限制\(t_i\),即到达该 ...
- Mongodb 重置密码或创建用户
1.关闭mongodb 服务 win+r 输入services.msc 回车 找到MongoDB 关闭掉 2.进入到 win +r 输入cmd 进入命令窗口 在进入到mongodb 的安装目 ...
- 【译】x86程序员手册21-6.3.5为操作系统保留的指令
6.3.5 Some Instructions are Reserved for Operating System 为操作系统保留的一些指令 Instructions that have the po ...
- 关于Qt 报QDomDocument: No such file or directory错误解决办法
肯定是没有找到相关的路径,这时候只需要在.pro文件中加入便好了,比如我要用到读写xml的一些头文件,则需要在.pro中加入如下代码: 就可以正常引用了.
- Build Tool-自动化构建工具
输入:工程文件+编译说明文件: 处理:自动化构建工具+编译器: 输出:可执行文件. 相对于手动编译. Historically, build automation was accomplished t ...
- 项目关联到svn
最近因为要升级项目,改用64位的eclipse,原先已经被svn管理的项目需要被复制到另一个工作空间,只需要导入并复制项目到新的工作空间即可 右键,点import 选择已经存在的项目导入工作空间 选择 ...
- 为.net mvc core 启用 https
引用nuget包:Microsoft.AspNetCore.Server.Kestrel.Https这是一个服务器测试ssl密钥,密码如代码里面所示 using System; using Syste ...
- 【Android】进程间通信IPC——Binder
Binder是Android中的跨进程通信方式,bindService的时候,服务端返回Binder对象,通过该对象客户端可以从服务端获取数据.在进程间通信IPC——AIDL中创建了ICustomAi ...
- Lua中返回值的丢失问题
Lua中返回值的丢失问题 -- 如果函数调用所得的多个返回值是另外一个函数的最后一个参数,或者是多指派表达式中的最后一个参数时,所有返回值将被传入或使用. -- 否则只有第一个返回值被使用或指定. T ...