[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))
这样从1到n一遍DP可以求出末尾最小的数
f[i]表示以i开头的最大的数的下标
f[i]=max(j) (i<=j<=n && t(i,j)<t(j+1,d[j+1]))
边界为f[d[n]]=n
这样从d[n]-1到1一遍DP可以求出开头最大的数,第二个最大的数。。。
注意前导0的情况
#include <cstdio>
#include <cstring>
#define N 1001 int n;
char s[N];
int d[N], f[N];
//d[i]表示以i结尾的数,满足条件的最小数
//f[i]表示以i开头的数,满足条件的最大数
//s[i][j]表示从i到j的数是多少 inline int cmp(int x1, int y1, int x2, int y2)
{
int i, j;
while(s[x1] == '0') x1++;
while(s[x2] == '0') x2++;
if(y1 - x1 == y2 - x2)
{
for(i = x1, j = x2; i <= y1; i++, j++)
{
if(s[i] > s[j]) return 1;
if(s[i] < s[j]) return 2;
}
return 0;
}
if(y1 - x1 > y2 - x2) return 1;
if(y1 - x1 < y2 - x2) return 2;
} int main()
{
int i, j, k;
scanf("%s", s + 1);
n = strlen(s + 1);
for(i = 1; i <= n; i++)
for(j = i; j >= 1; j--)
if(cmp(j, i, d[j - 1], j - 1) == 1)
{
d[i] = j;
break;
}
while(s[d[n] - 1] == '0') d[n]--;
for(i = d[n]; i <= n; i++) f[i] = n;
for(i = d[n] - 1; i >= 1; i--)
{
k = n;
for(j = i; j <= n; j++)
if(cmp(i, j, j + 1, f[j + 1]) == 2)
k = j;
f[i] = k;
}
if(cmp(1, n, d[n], n) == 0)
{
printf("%s", s + 1);
return 0;
}
j = 1;
while(j <= n)
{
for(i = j; i <= f[j]; i++)
printf("%c", s[i]);
j = f[j] + 1;
if(j <= n) putchar(',');
}
return 0;
}
[luoguP1415] 拆分数列(DP)的更多相关文章
- luoguP1415 拆分数列 [dp]
题目描述 给出一列数字,需要你添加任意多个逗号将其拆成若干个严格递增的数.如果有多组解,则输出使得最后一个数最小的同时,字典序最大的解(即先要满足最后一个数最小:如果有多组解,则使得第一个数尽量大:如 ...
- P1415 拆分数列 DP
传送门: 题意: 将一个数字串分成许多不同的小串,使得这些小串代表的数字严格递增,要求最后一个数字尽可能地小. 然后满足字典序尽可能大. 思路: 由于最后一个数字要尽可能地小,所以先处理出每个数的L[ ...
- 洛谷P1415 拆分数列[序列DP 状态 打印]
题目背景 [为了响应党中央勤节俭.反铺张的精神,题目背景描述故事部分略去^-^] 题目描述 给出一列数字,需要你添加任意多个逗号将其拆成若干个严格递增的数.如果有多组解,则输出使得最后一个数最小的同时 ...
- 洛谷 P1415 拆分数列 解题报告
拆分数列 题目背景 [为了响应党中央勤节俭.反铺张的精神,题目背景描述故事部分略去^-^] 题目描述 给出一列数字,需要你添加任意多个逗号将其拆成若干个严格递增的数. 如果有多组解,则输出使得最后一个 ...
- 洛谷P1415 拆分数列(dp)
题目链接:传送门 题目: 题目背景 [为了响应党中央勤节俭.反铺张的精神,题目背景描述故事部分略去^-^] 题目描述 给出一列数字,需要你添加任意多个逗号将其拆成若干个严格递增的数.如果有多组解,则输 ...
- 洛谷P1415 拆分数列
题目背景 [为了响应党中央勤节俭.反铺张的精神,题目背景描述故事部分略去^-^] 题目描述 给出一列数字,需要你添加任意多个逗号将其拆成若干个严格递增的数.如果有多组解,则输出使得最后一个数最小的同时 ...
- BZOJ 2431: [HAOI2009]逆序对数列( dp )
dp(i,j)表示1~i的全部排列中逆序对数为j的个数. 从1~i-1的全部排列中加入i, 那么可以产生的逆序对数为0~i-1, 所以 dp(i,j) = Σ dp(i-1,k) (j-i+1 ≤ k ...
- BZOJ2431:[HAOI2009]逆序对数列(DP,差分)
Description 对于一个数列{ai},如果有i<j且ai>aj,那么我们称ai与aj为一对逆序对数.若对于任意一个由1~n自然数组成的 数列,可以很容易求出有多少个逆序对数.那么逆 ...
- P1415 拆分数列
传送门 DP数列长度过大无法枚举,考虑DP设f1[i]储存以第i个字符为结尾时,的最后一个数最小时,这个数的开头的位置(很难想有木有)OK,状态有了,方程想一想就出来了:设$num[i][j]$为数列 ...
随机推荐
- URAL 1519 Formula 1 (插头DP,常规)
题意:给一个n*m的矩阵,格子中是'*'则是障碍格子,不允许进入,其他格子都是必走的格子,所走格子形成一条哈密顿回路,问有多少种走法? 思路: 本来是很基础的题,顿时不知道进入了哪个坑.这篇插头DP的 ...
- 传统BP对比CNN
传统BP vs CNN 存在2个问题 传统BP网络存在的问题: 权值太多,计算量太大 权值太多,需要大量样本进行训练 传统的BP来处理图像问题的话因为计算权值太多太大. 网络的建立要根据数据的大小来建 ...
- 【转载】WPF DataGrid 性能加载大数据
作者:过客非归 来源:CSDN 原文:https://blog.csdn.net/u010265681/article/details/76651725 WPF(Windows Presentatio ...
- helm istio k8s docker
helm https://hub.helm.sh/ k8s https://www.kubernetes.org.cn/k8s istio 微服务 https://istio.io/
- shell脚本,对MySQL数据库进行分库加分表备份
[root@localhost wyb]# cat table_backup.sh #!/bin/bash flag= user=root pass=test mysql -u$user -p&quo ...
- 什么是无符号段整数,什么又是有符号数,(c++与java语言里边的不同)
c++中:整型数分为有符号数和无符号数两种 unsigned int a;无符号整型变量a,意思是这个数最小值为0,最大值为2的32次方-1,因为一个整型数占四个字节,一个字节8位,共32位 int ...
- java集合测试类等
package demo.mytest; import java.lang.ref.SoftReference;import java.lang.ref.WeakReference;import ja ...
- C语言格式化说明符
1.1.1 格式化输入输出函数一.printf()函数printf()函数是格式化输出函数, 一般用于向标准输出设备按规定格式输出信息.在编写程序时经常会用到此函数.printf()函数的调用格式为: ...
- (38)zabbix中配置snmp监控
1.首先按照“snmp监控快速配置”文本文档在被监控的主机上安装.配置及启动snmp服务, 具体内容如下: 1).安装snmp yum install net-snmp* -y cp -a /etc/ ...
- 配置charles对手机进行抓包
1.如下打开charles配置信息:Help –> SSL Proxying –>Install Charles Root Certificate on a Mobile Device 2 ...