BZOJ 1055 HAOI2008 玩具取名

2021-06-25 10:22:48 字數 1271 閱讀 8477

題目:

分析:正著想不好搞,狀態太多,也不好轉移,肯定超時。於是我們反著想,將一條字串歸約成乙個字母,首先能想到乙個字串必須要先變成字母,才能變成乙個字母,而且這兩個字母中的第乙個字母一定是由左邊歸約出來的,第二個字母是由右邊歸約出來的。好的思路馬上就來了,我們用dp[i][j][k]表示字串[i,j]能不能歸約成字母k,我們只要列舉中間的分界線就行了,用記憶化搜尋會很容易寫。接下來我就不多說了,具體可以直接看**。

**:

#include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;

#define rep(i,a,b) for(int i=(a);i<(b);++i)

#define rrep(i,a,b) for(int i=(a);i>=(b);--i)

#define clr(a,x) memset(a,(x),sizeof(a))

#define eps 1e-9

#define ll long long

#define mp make_pair

#define lson l,m,rt<<1

#define rson m+1,r,rt<<1|1

const int maxn=200+5;

int ok[maxn][maxn][4];

int num[4];

bool adj[5][5][5];

char inpt[maxn];

int dfs(int l,int r,int ch)

}return 0;

}int main()

}scanf("%s",inpt);

int len=strlen(inpt);

rep(i,0,len)

bool no_ans=true;

if(dfs(0,len-1,0))

if(dfs(0,len-1,1))

if(dfs(0,len-1,2))

if(dfs(0,len-1,3))

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

puts("");

}}

BZOJ1055 HAOI 玩具取名

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

BZOJ1055 HAOI2008 玩具取名

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

bzoj1055 HAOI2008 玩具取名

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