luoguP1415 拆分數列 dp

2022-06-03 07:36:07 字數 1653 閱讀 2052

給出一列數字,需要你新增任意多個逗號將其拆成若干個嚴格遞增的數。如果有多組解,則輸出使得最後乙個數最小的同時,字典序最大的解(即先要滿足最後乙個數最小;如果有多組解,則使得第乙個數盡量大;如果仍有多組解,則使得第二個數盡量大,依次類推……)。

輸入格式:

共一行,為初始的數字。

輸出格式:

共一行,為拆分之後的數列。每個數之間用逗號分隔。行尾無逗號。

輸入樣例#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 #include

5using

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 拆分數列 解題報告

為了響應 勤節儉 反鋪張的精神,題目背景描述故事部分略去 給出一列數字,需要你新增任意多個逗號將其拆成若干個嚴格遞增的數。如果有多組解,則輸出使得最後乙個數最小的同時,字典序最大的解 即先要滿足最後乙個數最小 如果有多組解,則使得第乙個數盡量大 如果仍有多組解,則使得第二個數盡量大,依次類推 共一行...