題目:
分析:正著想不好搞,狀態太多,也不好轉移,肯定超時。於是我們反著想,將一條字串歸約成乙個字母,首先能想到乙個字串必須要先變成字母,才能變成乙個字母,而且這兩個字母中的第乙個字母一定是由左邊歸約出來的,第二個字母是由右邊歸約出來的。好的思路馬上就來了,我們用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 中任意兩個字母代替,使得自己的名字能夠擴充得很長。現在,他想請你猜猜某乙個很長的名字,最初可能是由哪幾個字母變形過來的。...