某人有一套玩具,並想法給玩具命名。首先他選擇wing四個字母中的任意乙個字母作為
玩具的基本名字。然後
他會根據自己的喜好,將名字中任意乙個字母用「wing」中任意兩個
字母代替,使得自己的名字能夠擴充得很長。
現在,他想請你猜猜某乙個很長的名字,最初
可能是由
哪幾個字母變形過來的。
第一行四個整數w、i、n、g。表示每乙個字母能由幾種兩個字母所替代。接下來w行,每行
兩個字母,表示w可
以用這兩個字母替代。接下來i行,每行兩個字母,表示i可以用這兩個字母替代
。接下來n行,每行兩個字母,表示n
可以用這兩個字母替代。接下來g行,每行兩個字母,表示g可以
用這兩個字母替代。最後一行乙個長度不超過len的
字串。表示這個玩具的名字。
1 1 1 1
iiww
wwig
iiii
inw可以變成ii所以iiii可以縮成ww in均能變成ww所以ww又可以縮成i或者n 所以最終答案
應該按照「wing」的順序
輸出in
[資料範圍]
100%資料滿足len<=200,w、i、n、g<=16
題目大意:
乙個字母可以多個兩個字母合成,如w可以由wi合成也可以由gi合成。
給定乙個字串,求它最初是由哪幾個字母組成的。
題解:區間dp
f[l][r][i]表示區間[l,r]能否合成i這個字母。
轉移方程為 f[l][r][i]=f[l][r][i]||(f[l][mid][p]&&f[mid+1][r][g])
其中mid為區間的斷點,p,g為合成i的兩個字母。
**:1a好開心 -~
#include#include#include
using
namespace
std;
intlen;
bool flag,f[220][220][5
];char a[220
];struct
sc[5
];int
main()
for(int k=2;k<=len;k++)}}
}}
for(int i=1;i<=4;i++)
}if(!flag)printf("
the name is wrong!");
return0;
}
BZOJ1055 HAOI 玩具取名
某人有一套玩具,並想法給玩具命名。首先他選擇wing四個字母中的任意乙個字母作為玩具的基本名字。然後 他會根據自己的喜好,將名字中任意乙個字母用 wing 中任意兩個字母代替,使得自己的名字能夠擴充得很長。現在,他想請你猜猜某乙個很長的名字,最初可能是由哪幾個字母變形過來的。第一行四個整數w i n...
BZOJ 1055 HAOI2008 玩具取名
題目 分析 正著想不好搞,狀態太多,也不好轉移,肯定超時。於是我們反著想,將一條字串歸約成乙個字母,首先能想到乙個字串必須要先變成字母,才能變成乙個字母,而且這兩個字母中的第乙個字母一定是由左邊歸約出來的,第二個字母是由右邊歸約出來的。好的思路馬上就來了,我們用dp i j k 表示字串 i,j 能...
BZOJ1055 HAOI2008 玩具取名
標籤 區間dp description 某人有一套玩具,並想法給玩具命名。首先他選擇wing四個字母中的任意乙個字母作為玩具的基本名字。然後 他會根據自己的喜好,將名字中任意乙個字母用 wing 中任意兩個字母代替,使得自己的名字能夠擴充得很長。現在,他想請你猜猜某乙個很長的名字,最初可能是由哪幾個...