給出一列數字,需要你新增任意多個逗號將其拆成若干個嚴格遞增的數。如果有多組解,則輸出使得最後乙個數最小的同時,字典序最大的解(即先要滿足最後乙個數最小;如果有多組解,則使得第乙個數盡量大;如果仍有多組解,則使得第二個數盡量大,依次類推……)。
輸入格式:
共一行,為初始的數字。
輸出格式:
共一行,為拆分之後的數列。每個數之間用逗號分隔。行尾無逗號。
輸入樣例#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
《拆分數列》解題報告by lzn 動態規劃常規題。
第一步先求出最後的那個數最小為多少。(為了敘述方便,記t(i,j)表示從原數列下標i取到j的數字組成的數。)只需正向dp一次,dp1[i]表示前i個數字分成任意多個遞增數且最後的數最小時,最後的數為t(dp1[i],i)。則dp1[i]=max(j),(t(dp1[j-1],j-1)第二步要求最後乙個數確定的情況下,前面的數字按字典序盡量大的解。類似上面的方法反向動歸一次即可。
演算法複雜度o(l^3)。由於資料大部分為隨機,實際執行效率接近l^2。
1 #include2 #include3 #include4 #include5using
namespace
std;67
const
int maxn=505;8
9string
str;
10int
a[maxn],n,dp[maxn],dp[maxn];
1112
bool cmp(int l1,int r1,int l2,int
r2)22
23//
dp[i]=max(j),(t(dp[j-1],j-1)24
void
dp1()
32//
printf("dp[%d] = %d\n",i,dp[i]);33}
34}3536
//dp[i]=max(j) (t(i,j)37
void
dp2()
47//
printf("dp[%d] = %d\n",i,dp[i]);48}
49}5051
void print(int l,int
r)55
56void
print()64}
6566
intmain()
洛谷P1415 拆分數列 解題思路
因為某些申必原因被刪除 題目描述 給出一列數字,需要你新增任意多個逗號將其拆成若干個嚴格遞增的數。如果有多組解,則輸出使得最後乙個數最小的同時,字典序最大的解 即先要滿足最後乙個數最小 如果有多組解,則使得第乙個數盡量大 如果仍有多組解,則使得第二個數盡量大,依次類推 輸入輸出格式 輸入格式 共一行...
P1415 拆分數列(記憶化搜尋)
這麼麻煩的題敲出來沒wa真的是舒服 原題 題意 給出一列數字,需要你新增任意多個逗號將其拆成若干個嚴格遞增的數。如果有多組解,則輸出使得最後乙個數最小的同時,字典序最大的解 即先要滿足最後乙個數最小 如果有多組解,則使得第乙個數盡量大 如果仍有多組解,則使得第二個數盡量大,依次類推 解析 大小比較函...
洛谷 P1415 拆分數列 解題報告
為了響應 勤節儉 反鋪張的精神,題目背景描述故事部分略去 給出一列數字,需要你新增任意多個逗號將其拆成若干個嚴格遞增的數。如果有多組解,則輸出使得最後乙個數最小的同時,字典序最大的解 即先要滿足最後乙個數最小 如果有多組解,則使得第乙個數盡量大 如果仍有多組解,則使得第二個數盡量大,依次類推 共一行...