[haoi2008]玩具取名
時間限制:c/c++
1秒,其他語言2秒
空間限制:c/c++
262144k,其他語言524288k
64bit io format:
%lld
某人有一套玩具,並想法給玩具命名。首先他選擇wing四個字母中的任意乙個字母作為玩具的基本名字。然後他會根據自己的喜好,將名字中任意乙個字母用「wing」中任意兩個字母代替,使得自己的名字能夠擴充得很長。現在,他想請你猜猜某乙個很長的名字,最初可能是由哪幾個字母變形過來的。 輸入描述:
第一行四個整數w、i、n、g。表示每乙個字母能由幾種兩個字母所替代。 接下來w行,每行兩個字母,表示w可以用這兩個字母替代。
接下來i行,每行兩個字母,表示i可以用這兩個字母替代。 接下來n行,每行兩個字母,表示n可以用這兩個字母替代。
接下來g行,每行兩個字母,表示g可以用這兩個字母替代。 最後一行乙個長度不超過len的字串。表示這個玩具的名字。
一行字串,該名字可能由哪些字母變形而得到。(按照wing的順序輸出) 如果給的名字不能由任何乙個字母變形而得到則輸出「the name示例1is wrong!」
輸入
111
1iiwwww
igiiii
輸出
in
題目雖然輸入的是字母,但是我們可以當做數字來處理
重要的兩個陣列,均為bool型
dp[i][j][k]表示區間[i,j]是否是由k轉化而來的
can[i][j][k]表示i是否可以用 j k 兩個字母代替
can是在讀入時更新
我們想一想區間更新的條件:
區間[l,r],中間點為k
z,z1,z2為1~4,表示為wing
如果左區間[l,k+1]可以由z1轉化(即**dp[l][k][z1]),右區間[k+1,r]可以由z2轉化(**dp[k+1][r][z2]),
z可以用z1和z2來代替(**dp[z][z1][z2]),那是不是就說明區間[l,r]是由z轉化的
(相當於z1,z2是乙個中轉站,用來將區間[l,r]與z聯絡在一起)
套上區間dp的萬能模板
就能得到
for
(int i=
1;i<=len;i++
) dp[i]
[i][a[i]]=
true
;//從i到i可以由他自己轉化
for(
int led=
1;led)//列舉長度的可能性
for(
int l=
1;l<=len-led;l++
)//列舉左界的可能性
#include
using
namespace std;
const
int maxn=
3e2+7;
int dp[maxn]
[maxn]
[maxn]
;bool can[maxn]
[maxn]
[maxn]
;int p[maxn]
;char s[maxn]
;int a[
300]
;int
change
(char i)
intmain()
} cin>>
(s+1);
int n=
strlen
(s+1);
// cout(int i=
1;i<=n;i++
)dp[i]
[i][a[s[i]]]
=1;for
(int len=
2;len<=n;len++)}
}}}}
bool flag=
false;if
(dp[1]
[n][1]
)if(dp[1]
[n][2]
)if(dp[1]
[n][3]
)if(dp[1]
[n][4]
)if(!flag)
printf
("the name is wrong!");
}
移動玩具 HAOI2008
在乙個4 4的方框內擺放了若干個相同的玩具,某人想將這些玩具重新擺放成為他心中理想的狀態,規定移動時只能將玩具向上下左右四個方向移動,並且移動的位置不能有玩具,請你用最少的移動次數將初始的玩具狀態移 動到某人心中的目標狀態。前4行表示玩具的初始狀態,每行4個數字1或0,1表示方格中放置了玩具,0表示...
HAOI2008 移動玩具
非常抱歉,菜雞風潯凌又來水藍題了qwq 看到題解上寫雙向搜尋?什麼鬼.看到資料範圍特別小,直接劃分二分圖,兩個點之間連線容量為1,費用為曼哈頓距離的邊,跑費用流即可。什麼?你問我那個不能移動到有玩具的格仔的限制?不用管了啦,因為費用流會給你跑費用最小的,也就是每個點都會找到最近的那個點,不會有其他點...
HAOI2008 移動玩具
time limit 10 sec memory limit 162 mb submit 2561 solved 1430 submit status discuss 在乙個4 4的方框內擺放了若干個相同的玩具,某人想將這些玩具重新擺放成為他心中理想的狀態,規定移動 時只能將玩具向上下左右四個方向移...