problemcodevs
洛谷
題意:對於包含字母a到y各一次的單詞s,將其從上到下從左到右寫在乙個5*5的矩陣中,如單詞adjptbekqucglrvfinswhmoxy寫出來如下:
a d j p t
b e k q u
c g l r v
f i n s w
h m o x y
若該矩陣滿足每一行每一列的字母都是字典序遞增的則稱s為優美的,如上述單詞就是
優美的,而adjptbegqucklrvfinswhmoxy則不是(第二列不滿足要求)。
your task
將所有優美的單詞按字典序列出,從小到大編號1,2,……
請你完成以下兩種任務:
1. 給定乙個優美的單詞,求其編號。
2. 給定乙個編號,求對應的優美的單詞。
輸入描述input description
第一行乙個字母,w表示任務1,n表示任務2
若是任務1,第二行是乙個優美的單詞,否則第二行是乙個正整數,表示某個優美的單
詞的編號,保證該數不超過優美的單詞的總數
輸出描述output description
一行,若是任務1,輸出對應編號,否則輸出對應的優美的單詞
思路:試圖找規律 無果 所以就搜尋啦 (在做之前就知道是一道搜尋題qwq)從小到達列舉字母來填方格時
對於每一行 左邊的必須比右邊先填(保證從左至右遞增)
對於每一列 上面的必須比下面先填(保證從上至下遞增)
so dfs(a,b,c,d,e,now) a表示第一行已經填了幾個 b,c,d,e 同推 now表示現在要填第幾個字母了(1表示a etc.)
帶上記憶化搜尋
那麼就是f[a][b][c][d][e]表示第一行填了a個,第二行填b個,第三行填c個,第四行填d個,第5行填e個的滿足題意的總方案數
現在我們具體來看兩個問題:
1.給定序列求編號
就是求字典序比它小的合法序列個數再加1(加上它自己)
列舉第1-25位上的數的字母 每一位都不能超過題目給定序列對應位置上的字母 (不能等於!)
舉個栗子:
我們要知道以be開頭的合法序列個數 那麼搜第一位為a的串行列數
然後搜第一二位為be的合法序列數 而不是搜第一位為b的合法序列數
然後把搜尋到的方案數都加起來 輸出答案記得加上1
2.給定編號求序列
同從小到大列舉第1-25位上的數字
假設 我們求第90個序列 現在列舉第二位(第一位必為a) 第二位為b時 有方案80種 ;為c時 有方案30種
那麼要求的第90個序列的第二位一定為 c (方案總數剛好大於90)
以此類推 一位一位地確定下去
1 #include2 #include3 #include4 #includeview code5using
namespace
std;
6int f[6][6][6][6][6],map[30
],ans;
7bool ck(int a,int b)
8int dfs(int a,int b,int c,int d,int e,int
now)920
intmain()
2130 printf("
%d",ans+1); //
要+131}32
else
42for(register int i=1;i<=25;i++) printf("
%c",map[i]-1+'a'
);43}44
return0;
45 }
題解 USACO5 5 貳五語言Two Five
一道記憶化搜尋題 題目定義一類行列均單調遞增的 5 times5 矩陣,將其展開後所形成的字串按字典序編號.題目要求實現編號與字串的相互轉換 先不管字串與編號的相互轉換 給你一些限定條件 形如 x,y 處只能填某字元 讓你求滿足條件的合法矩陣數 1 暴搜 有兩種思路,一種是按順序搜每乙個格仔放哪乙個...
python 單詞矩陣
給定乙份單詞的清單,設計乙個演算法,建立由字母組成的面積最大的矩形,其中每一行組成乙個單詞 自左向右 每一列也組成乙個單詞 自上而下 不要求這些單詞在清單裡連續出現,但要求所有行等長,所有列等高。如果有多個面積最大的矩形,輸出任意乙個均可。乙個單詞可以重複使用。示例 1 輸入 this real h...
codevs1322 單詞矩陣
題目描述 description 對於包含字母a到y各一次的單詞s,將其從上到下從左到右寫在乙個5 5的矩陣中,如單 詞adjptbekqucglrvfinswhmoxy寫出來如下 a d j p t b e k q u c g l r v f i n s w h m o x y 若該矩陣滿足每一行...