问题标题: 洛谷:P2750 [USACO5.5]贰五语言Two Five

0
0
已解决
黄昊轩
黄昊轩
新手守护
新手守护

题目描述

有一种奇怪的语言叫做“贰五语言”。它的每个单词都由A~Y这25个字母各一个组成。但是,并不是任何一种排列都是一个合法的贰五语言单词。贰五语言的单词必须满足这样一个条件:把它的25个字母排成一个5*5的矩阵,它的每一行和每一列都必须是递增的。比如单词ACEPTBDHQUFJMRWGKNSXILOVY,它排成的矩阵如下所示:

A C E P T

B D H Q U

F J M R W

G K N S X

I L O V Y

因为它的每行每列都是递增的,所以它是一个合法的单词。而单词YXWVUTSRQPONMLKJIHGFEDCBA则显然不合法。 由于单词太长存储不便,需要给每一个单词编一个码。编码方法如下:从左到右,再从上到下,可以由一个矩阵的得到一个单词,再把单词按照字典顺序排序。比如,单词ABCDEFGHIJKLMNOPQRSTUVWXY的编码为1,而单词ABCDEFGHIJKLMNOPQRSUTVWXY的编码为2。

现在,你需要编一个程序,完成单词与编码间的转换。

输入输出格式

输入格式:

 

第一行为一个字母N或W。N表示把编码转换为单词,W表示把单词转换为编码。

若第一行为N,则第二行为一个整数,表示单词的编码。若第一行为W,则第二行为一个合法的单词。

 

输出格式:

 

每行一个整数或单词。

 

输入输出样例

输入样例#1: 复制

N
2

输出样例#1: 复制

ABCDEFGHIJKLMNOPQRSUTVWXY

输入样例#2: 复制

W 
ABCDEFGHIJKLMNOPQRSUTVWXY

输出样例#2: 复制

2

说明

题目翻译来自NOCOW。

USACO Training Section 5.5

(我不会采纳某些蔑视别人的回答)

(陈星宇,别回答了!)


0
已采纳
高亮节
高亮节
资深守护
资深守护

int main(){ int i,j,n; scanf("%s",st); if(st[0] == 'N'){ scanf("%d",&n); For(i, 0, 24){ for(s[i]='A' ; ;++s[i]){

memset(dp,0,sizeof(dp)); int tmp = dfs(0,0,0,0,0,0); if(tmp >= n)break;

if(now == 25) return 1; int ret = dp[a][b][c][d][e]; if(ret) return ret;  if(a < 5 && check(a, now)) ret += dfs(a + 1, b, c, d, e, now + 1);  if(b < a && check(b + 5, now)) ret += dfs(a, b + 1, c, d, e, now + 1); if(c < b && check(c + 10, now)) ret += dfs(a, b, c + 1, d, e, now + 1); if(d < c && check(d + 15, now)) ret += dfs(a, b, c, d + 1, e, now + 1); if(e < d && check(e + 20, now)) ret += dfs(a, b, c, d, e + 1, now + 1); return dp[a][b][c][d][e] = ret;

(记忆化

0
0
我要回答