BZOJ1055 HAOI2008 玩具取名

2022-05-12 03:18:24 字數 2090 閱讀 4656

time limit: 10 sec  memory limit: 162 mb

submit: 820  solved: 482

[submit][status]

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

第一行四個整數w、i、n、g。表示每乙個字母能由幾種兩個字母所替代。接下來w行,每行兩個字母,表示w可以用這兩個字母替代。接下來i行,每行兩個字母,表示i可以用這兩個字母替代。接下來n行,每行兩個字母,表示n可以用這兩個字母替代。接下來g行,每行兩個字母,表示g可以用這兩個字母替代。最後一行乙個長度不超過len的字串。表示這個玩具的名字。

一行字串,該名字可能由哪些字母變形而得到。(按照wing的順序輸出)如果給的名字不能由任何乙個字母變形而得到則輸出「the name is wrong!」

1 1 1 1

iiww

wwig

iiii

inw可以變成ii所以iiii可以縮成ww in均能變成ww所以ww又可以縮成i或者n 所以最終答案應該按照「wing」的順序輸出in [資料範圍] 30%資料滿足len<=20,w、i、n、g<=6 100%資料滿足len<=200,w、i、n、g<=16

題解:真是一道巧妙的dp!!!

oi不是考你會不會什麼演算法,而是看你能不能想到。真正的大牛不會因為不會碼什麼而不會做什麼題,什麼演算法都隨便寫,只要想到。。。

這題如果有dp的想法就很簡單了,dp[i][j][k]表示從 i 到 j 能否變成 k,然後就很好轉移了。

oi就應該多考這種思路巧妙而**量又不大的題目!!!

**:

1 #include2 #include3 #include4 #include5 #include6 #include7 #include8 #include9 #include

10 #include11 #include

12#define inf 1000000000

13#define maxn 300+100

14#define maxm 500+100

15#define eps 1e-10

16#define ll long long

17#define pa pair18

#define for0(i,n) for(int i=0;i<=(n);i++)

19#define for1(i,n) for(int i=1;i<=(n);i++)

20#define for2(i,x,y) for(int i=(x);i<=(y);i++)

21using

namespace

std;

22const

char t[5]=;

23 inline int

read()

2427

while(ch>='

0'&&ch<='9')

28return x*f;29}

30 vector a[5][5

];31

int num[5

],n,ans;

32bool dp[maxn][maxn][5

];33

string

s;34 inline int hash(char

ch)35

41int

main()

4252 cin>>s;

53 n=s.length();

54 for1(i,n)dp[i][i][hash(s[i-1])]=1

; 55 for2(l,2

,n)56 for1(i,n-l+1)57

67 ans=0

;68 for1(i,4)if(dp[1][n][i])ans++,cout<

69if(!ans)puts("

the name is wrong!

");

70return0;

71 }

view code

BZOJ1055 HAOI 玩具取名

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

BZOJ 1055 HAOI2008 玩具取名

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

BZOJ1055 HAOI2008 玩具取名

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