Codevs1322 單詞矩陣

2022-05-13 11:47:50 字數 3418 閱讀 1705

對於包含字母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. 給定乙個編號,求對應的優美的單詞。

第一行乙個字母,w表示任務1,n表示任務2

若是任務1,第二行是乙個優美的單詞,否則第二行是乙個正整數,表示某個優美的單詞的編號,保證該數不超過優美的單詞的總數

一行,若是任務1,輸出對應編號,否則輸出對應的優美的單詞

w abcdefghijklmnopqrsutvwxy

n 20

2 abcdefghijklmnopqsuwrtvxy

無普通搜尋顯然tle(列舉每一位填什麼字母o(26!))

注意條件每一行每一列的字母都是字典序遞增→每個字母必須小於右下方所有的字母

考慮從a到z依次填入矩陣0~24中,記憶化搜尋f[a][b][c][d][e]記錄當前狀態後繼方案數,滿足a>b>c>d>e,並且當前已經填入的數要是原樣,src(a,b,c,d,e,tot)tot記錄要填入哪個字母。

對於第乙個任務,求編號,那麼每個位置可以填1~s[i]-『a』+1,統計之前的方案數,最終方案數加上自己即可+1。

對於第二個任務,求方案,那麼每個位置從』a』開始填,知道》n,最終求出的即為結果。

碼題解的時候發現如果用過的字母就不要用了,加上優化發現快了不少。

1

//- mon sep 19 08:11:51 20162//

this file is made by yjinpeng,created by xuyike's black technology automatically.3//

4//i don't know what this program is.

56 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include 13

#define mod 1000000007

14#define inf 1e9

15using

namespace

std;

16 typedef long

long

ll;17

const

int maxn=6;18

const

int maxm=36

;19 inline int max(int &x,int &y)

20 inline int min(int &x,int &y)

21 inline int

gi()

28char s[maxm];int

ans[maxm];

29int

f[maxn][maxn][maxn][maxn][maxn];

30 inline bool check(int x,int c)

31 inline int src(int a,int b,int c,int d,int e,int

tot)

42int

main()

4354 printf("

%d",n+1

);55 }else

63for(int i=0;i<25;i++)putchar(int(ans[i]+'

a'-1

));64}65

return0;

66 }

view code

小優化-s

1

//- mon sep 19 08:11:51 20162//

this file is made by yjinpeng,created by xuyike's black technology automatically.3//

4//i don't know what this program is.

56 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include 13

#define mod 1000000007

14#define inf 1e9

15using

namespace

std;

16 typedef long

long

ll;17

const

int maxn=6;18

const

int maxm=36

;19 inline int max(int &x,int &y)

20 inline int min(int &x,int &y)

21 inline int

gi()

28char s[maxm];int

ans[maxm],used[maxm];

29int

f[maxn][maxn][maxn][maxn][maxn];

30 inline bool check(int x,int c)

31 inline int src(int a,int b,int c,int d,int e,int

tot)

42int

main()

4356 used[ans[i]]=1;57

}58 printf("

%d",n+1

);59 }else

68 used[ans[i]]=1;69

}70for(int i=0;i<25;i++)putchar(int(ans[i]+'

a'-1

));71}72

return0;

73 }

view code

這裡不得不再提起常數優化,演算法優化,小優化→大分數。這點意識真的要有,說不准快了0.01s你就多過了10分,說不准多十分你就保送,進隊,金牌,一等獎,降分…… 

來看下效果:

之後

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 若該矩陣滿足每一行...

Codevs 單詞接龍 DFS,substr

單詞接龍 深搜和substr 函式的使用。由於相連線的單詞只會是乙個連乙個,不可能出現乙個單詞隔著連兩個 這樣中間那個就沒用了 所以不需要儲存連線好的 龍 只需知道任意兩個單詞之間能否相連,最少幾個字母相連,隻後就可以用dfs來搜尋最長 龍 雖然理論上是會超時的,但資料較水,從題目中n 20也就應該...

CodeVS3013 單詞背誦

靈夢有n個單詞想要背,但她想通過一篇文章中的一段來記住這些單詞。文章由m個單詞構成,她想在文章中找出連續的一段,其中包含最多的她想要背的單詞 重複的只算乙個 並且在背誦的單詞量盡量多的情況下,還要使選出的文章段落盡量短,這樣她就可以用盡量短的時間學習盡可能多的單詞了。第1行乙個數n,接下來n行每行是...