Bzoj 1055 玩具取名(區間DP)

2022-05-07 19:45:07 字數 1108 閱讀 9528

字元很麻煩,不妨用數字代替(比如1代表'w')

const char c[5] = ;
接著,像這種兩個子串可以合併成另乙個子串的題可以考慮區間$dp$

設$bool$陣列$f_$表示區間$[l,r]$能否合成單個字元$c_k$

於是就可以套區間$dp$的板子了

#include #include #include #include using std::min; using std::max;

using std::sort; using std::swap;

using std::unique; using std::lower_bound;

using std::map;

typedef long long ll;

templatevoid read(t &x)

while(ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar(); x *= flag;

}const int len = 2e2 + 10, _ = 5;

const char c[5] = ;

char s[len]; bool p, f[len][len][_];

int num[_], list[len][_], tot, len;

int check(char x)

int main ()

scanf("%s", s + 1), len = strlen(s + 1);

for(int i = 1; i <= len; ++i) f[i][i][check(s[i])] = true;

for(int k = 1; k <= len; ++k)

for(int i = 1; i + k <= len; ++i)

for(int i = 1; i <= 4; ++i)

if(f[1][len][i]) putchar(c[i]), p = true;

if(!p) printf("the name is wrong!");

puts("");

return 0;

}

BZOJ1055 HAOI 玩具取名

某人有一套玩具,並想法給玩具命名。首先他選擇wing四個字母中的任意乙個字母作為玩具的基本名字。然後 他會根據自己的喜好,將名字中任意乙個字母用 wing 中任意兩個字母代替,使得自己的名字能夠擴充得很長。現在,他想請你猜猜某乙個很長的名字,最初可能是由哪幾個字母變形過來的。第一行四個整數w i n...

BZOJ 1055 HAOI2008 玩具取名

題目 分析 正著想不好搞,狀態太多,也不好轉移,肯定超時。於是我們反著想,將一條字串歸約成乙個字母,首先能想到乙個字串必須要先變成字母,才能變成乙個字母,而且這兩個字母中的第乙個字母一定是由左邊歸約出來的,第二個字母是由右邊歸約出來的。好的思路馬上就來了,我們用dp i j k 表示字串 i,j 能...

BZOJ1055 HAOI2008 玩具取名

標籤 區間dp description 某人有一套玩具,並想法給玩具命名。首先他選擇wing四個字母中的任意乙個字母作為玩具的基本名字。然後 他會根據自己的喜好,將名字中任意乙個字母用 wing 中任意兩個字母代替,使得自己的名字能夠擴充得很長。現在,他想請你猜猜某乙個很長的名字,最初可能是由哪幾個...