[洛谷P2750] [USACO5.5]贰五语言Two Five
洛谷题目链接:[USACO5.5]贰五语言Two Five
题目描述
有一种奇怪的语言叫做“贰五语言”。它的每个单词都由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
题解: 我尝试过爆搜,但是在我\(A\)了这题之后都还没枚举完所有情况...
显然这个状态是非常多的,接近\(25!\),所以我们需要将其中一些状态记忆化一下.
我们设\(f[a][b][c][d][e]\)表示第\(1\)行填入了\(a\)个数,第\(2\)行填入了\(b\)个数....的方案.因为我们在填数的时候一定是一个像这样的形状(转自zyzzyzzyzzyz的图):

要填入绿色的块之前一定要先填入黄色的块.
那么我们可以计算出方案数之后,就考虑如何计算答案.我们可以通过类似倍增求\(lca\)的方式来统计答案.回忆一下倍增是如何求\(lca\)的?从大到小枚举向上跳的距离,如果超过了就不跳.这里也是类似的方法.
我们在求方案数的时候会用一个\(vis\)数组来记录某个数字是否可以用,那么在我们修改限制的时候,每次计算出的方案数很显然是会不一样的,这时候就可以用我们上面提到的方法了.
具体细节有点讲不太清,看代码吧.
#include<bits/stdc++.h>
using namespace std;
int n, vis[30];
int f[7][7][7][7][7];
char opt, s[30];
bool ok(int x, int num){
    return !vis[x] || vis[x] == num;
}
int dfs(int a, int b, int c, int d, int e, int x){
    if(x == 26) return 1;
    if(f[a][b][c][d][e]) return f[a][b][c][d][e];
    int res = 0;
    if(a <= 5 && ok(a, x)) res += dfs(a+1, b, c, d, e, x+1);
    if(b < a && ok(b+5, x)) res += dfs(a, b+1, c, d, e, x+1);
    if(c < b && ok(c+10, x)) res += dfs(a, b, c+1, d, e, x+1);
    if(d < c && ok(d+15, x)) res += dfs(a, b, c, d+1, e, x+1);
    if(e < d && ok(e+20, x)) res += dfs(a, b, c, d, e+1, x+1);
    return f[a][b][c][d][e] = res;
}
int main(){
    int tmp; cin >> opt;
    if(opt == 'N'){
        cin >> n;
        for(int i = 1; i <= 25; i++){
            for(vis[i] = 1; ; vis[i]++){
                memset(f, 0, sizeof(f));
                tmp = dfs(1, 1, 1, 1, 1, 1);
                if(tmp >= n) break;
                n -= tmp;
            }
        }
        for(int i = 1; i <= 25; i++) cout << (char)(vis[i]-1+'A');
        cout << endl;
    }
    else {
        int res = 0; cin >> s+1;
        for(int i = 1; i <= 25; i++)
            for(vis[i] = 1; vis[i] < s[i]-'A'+1; vis[i]++){
                memset(f, 0, sizeof(f));
                res += dfs(1, 1, 1, 1, 1, 1);
            }
        cout << res+1 << endl;
    }
    return 0;
}
												
											[洛谷P2750] [USACO5.5]贰五语言Two Five的更多相关文章
- 洛谷P1345 [USACO5.4]奶牛的电信Telecowmunication【最小割】分析+题解代码
		
洛谷P1345 [USACO5.4]奶牛的电信Telecowmunication[最小割]分析+题解代码 题目描述 农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流. ...
 - [洛谷P1709] [USACO5.5]隐藏口令Hidden Password
		
洛谷题目链接:[USACO5.5]隐藏口令Hidden Password 题目描述 有时候程序员有很奇怪的方法来隐藏他们的口令.Binny会选择一个字符串S(由N个小写字母组成,5<=N< ...
 - [洛谷P2747] [USACO5.4]周游加拿大Canada Tour
		
洛谷题目链接:[USACO5.4]周游加拿大Canada Tour 题目描述 你赢得了一场航空公司举办的比赛,奖品是一张加拿大环游机票.旅行在这家航空公司开放的最西边的城市开始,然后一直自西向东旅行, ...
 - [洛谷P2745] [USACO5.3]窗体面积Window Area
		
洛谷题目链接:[USACO5.3]窗体面积Window Area 题目描述 你刚刚接手一项窗体界面工程.窗体界面还算简单,而且幸运的是,你不必显示实际的窗体.有 5 种基本操作: 创建一个新窗体 将窗 ...
 - 洛谷 P2701 [USACO5.3]巨大的牛棚Big Barn Label:二维数组前缀和 你够了 这次我用DP
		
题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N ...
 - 洛谷1345 [Usaco5.4]奶牛的电信
		
题目描述 农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流.这些机器用如下的方式发送电邮:如果存在一个由c台电脑组成的序列a1,a2,...,a(c),且a1与a2相 ...
 - P2750 贰五语言Two Five USACO5.5 记忆化搜索
		
正解:记搜+逼近 解题报告: 神仙题预警,,, 我真滴觉得还是挺难的了,,, 大概说下思路趴QAQ 首先我们要知道逼近法是什么! 逼近法,有点像二分的思路,以这题为例举个eg 假如它给了个数字k.我们 ...
 - 洛谷 P2746 [USACO5.3]校园网Network of Schools 解题报告
		
P2746 [USACO5.3]校园网Network of Schools 题目描述 一些学校连入一个电脑网络.那些学校已订立了协议:每个学校都会给其它的一些学校分发软件(称作"接受学校&q ...
 - 洛谷——P1345 [USACO5.4]奶牛的电信Telecowmunication
		
P1345 [USACO5.4]奶牛的电信Telecowmunication 题目描述 农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流.这些机器用如下的方式发送电邮 ...
 
随机推荐
- 1st  构建之法读后感
			
构建之法读后感 由于时间和书的篇幅所限,所以我没能真正通读全书,只通过网上的介绍和书内前言及目录,大概了解了构建之法是一本怎样的一本书. 这本书是由具有长达20年一线软件开发经验的邹欣老师所撰写,他以 ...
 - C 语言疑难杂症 [转:http://blog.chinaunix.net/uid-20688544-id-1894880.html]
			
无聊在网上找了些C语言的东东练一下手,竟然发现其实还有好多细节之前,没注意到,该好好复习一下先. 解决掉的问题先不发出来,把疑问的先做个笔记,过几天解决了就回来修改补上. #include < ...
 - windows安装安卓开发环境Eclipse+SDK+ADT
			
准备条件 操作系统:win7 64位 需要的资源:JDK.Eclipse.SDK.ADT 步骤简介: 第一步:下载安装最新版JDK 第二步:下载安装Eclipse 第三步:下载安装SDK 第四步:安装 ...
 - Jquery简单实现Datepicker
			
cshtml: <input type="text" id="purchaseDate" name="PurchaseDate" va ...
 - 【poj2409】Let it Bead  Polya定理
			
题目描述 用 $c$ 种颜色去染 $r$ 个点的环,如果两个环在旋转或翻转后是相同的,则称这两个环是同构的.求不同构的环的个数. $r·c\le 32$ . 题解 Polya定理 Burnside引理 ...
 - 【uoj#310】[UNR #2]黎明前的巧克力  FWT
			
题目描述 给出 $n$ 个数,从中选出两个互不相交的集合,使得第一个集合与第二个集合内的数的异或和相等.求总方案数. 输入 第一行一个正整数 $n$ ,表示巧克力的个数.第二行 $n$ 个整数 $a_ ...
 - 【bzoj4006】[JLOI2015]管道连接  斯坦纳树+状压dp
			
题目描述 给出一张 $n$ 个点 $m$ 条边的无向图和 $p$ 个特殊点,每个特殊点有一个颜色.要求选出若干条边,使得颜色相同的特殊点在同一个连通块内.输出最小边权和. 输入 第一行包含三个整数 n ...
 - jmeter链接多台负载机报错
			
遇到常见的问题: 1.在Controller端上控制某台机器Run,提示“Bad call to remote host” 解决方案:检查被控制机器上的jmeter-server有没有启动,或者JMe ...
 - BZOJ3551 ONTAK2010Peaks加强版(kruskal重构树+dfs序+主席树)
			
kruskal重构树本质就是给并查集显式建树来替代可持久化并查集.将边按困难度从小到大排序后建出该树,按dfs序建主席树即可.查询时跳到深度最浅的满足在该重要度下已被合并的点,在子树内查询第k大. # ...
 - Luogu4897 【模板】最小割树
			
没事干写一发模板. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib& ...