對於包含字母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,最終求出的即為結果。
碼題解的時候發現如果用過的字母就不要用了,加上優化發現快了不少。
1view code//- 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 }
小優化-s
1view code//- 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 }
這裡不得不再提起常數優化,演算法優化,小優化→大分數。這點意識真的要有,說不准快了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行每行是...