輸出方案的區間DP Folding

2021-10-01 01:28:50 字數 1325 閱讀 9453

bill試圖通過摺疊其中的重複子序列來緊湊地表示從「a」到「z」的大寫字母字串行。

例如,表示序列aaaaaaaaaabababccd的一種方法是10(a)2(ba)b2(c)d。他通過以下方式正式定義了摺疊的字串行以及它們的展開變換: 包含從「a」到「z」的單個字元的序列被認為是摺疊序列。展開此序列會產生單個字元本身的相同序列。 如果s和q是摺疊序列,則sq也是摺疊序列。如果s展開到s』並且q展開到q』,則sq展開到s』q』。

如果s是摺疊序列,則x(s)也是摺疊序列,其中x是大於1的整數的十進位制表示。如果s展開到s』,則x(s)展開到s』重複x倍。

根據這個定義,很容易展開任何給定的摺疊序列。但是,比爾對逆向轉型更感興趣。他希望摺疊給定的序列,使得得到的摺疊序列包含盡可能少的字元數。

我們設f[i

][j]

f[i][j]

f[i][j

]表示[i,

j]

[i,j]

[i,j

]的最小字元數,設g[i

][j]

g[i][j]

g[i][j

]表示[i,

j]

[i,j]

[i,j

]的反感。

顯然對於區間[i,

j]

[i,j]

[i,j

]的答案,一定分為兩部分:

這道題對我們的啟示就是dp輸出反感不一定要做完以後再遞迴查詢,當答案序列不大時可以邊做邊記錄。

**如下:

#include

using

namespace std;

const

int n =

200;

char a[n]

;string g[n]

[n], t[n]

[n];

int f[n]

[n], c[n]

[n], pre[n]

[n], n;

intfind

(int l,

int r)

if(flag ==1)

return l;

}return0;

}//尋找最小迴圈節

string str

(int x)

intmain

(void

)for

(int len=

2;len<=n;

++len)

for(

int i=

1;i<=n-len+1;

++i)

cout<[n]

}

選課 樹形dp 輸出方案

更新提示 第一次更新 這道題的樹上分組揹包的做法已經在 選課 有樹形依賴的揹包問題 中講過了,本篇部落格中主要講解將多叉樹轉二叉樹的做法,以便輸出方案。正文 學校實行學分制。每門的必修課都有固定的學分,同時還必須獲得相應的選修課程學分。學校開設了n n 500 門的選修課程,每個學生可選課程的數量m...

Ruby的輸出方法

print hello world.n 下劃線部分被稱為string物件或者字串物件,也可以直接稱這部分為字串。資料在程式中表現為物件。在ruby中,字串 數值 時間等各種資料都是物件。注 n是換行符,與大多數語言一樣。print是乙個方法。所謂方法就是物件的行為。print方法的作用就是輸出 裡的...

PHP的幾種輸出方式

請寫出echo print r print var dump die之間的區別 echo 只能輸出字串等單一資料 不能輸出資料型別 不能輸出陣列等多種資料 print 只能輸出字串等單一資料 不能輸出資料型別 不能輸出陣列等多種資料有返回值true false print r 既能輸出字串等單一資料...