[洛谷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 题目描述 农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流.这些机器用如下的方式发送电邮 ...
随机推荐
- 03慕课网《进击Node.js基础(一)》API-URL网址解析
url url.parse(url,query,host);解析域名 url必须,地址字符串 query可选 host 可选:在不清楚协议时正确解析 querystring 字符串和对象之间互相解析 ...
- java 中的 i=i++
记得大学刚开始学C语言时,老师就说:自增有两种形式,分别是i++和++i,i++表示的是先赋值后加1,++i是先加1后赋值,这样理解了很多年也没出现问题,直到遇到如下代码,我才怀疑我的理解是不是错了: ...
- EXT4.1表单提交(非AJAX)
Ext.require([ 'Ext.form.*', 'Ext.data.*' ]); Ext.onReady(function(){ Ext.apply(Ext.form.VTypes, { re ...
- SGU 199 Beautiful People 二维最长递增子序列
题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=20885 题意: 求二维最长严格递增子序列. 题解: O(n^2) ...
- css全局样式基础代码
body{ font-size:12px; font-family:"宋体",Arial, Helvetica, sans-serif;color:#363636;backgrou ...
- lintcode-391-数飞机
391-数飞机 给出飞机的起飞和降落时间的列表,用 interval 序列表示. 请计算出天上同时最多有多少架飞机? 注意事项 如果多架飞机降落和起飞在同一时刻,我们认为降落有优先权. 样例 对于每架 ...
- springmvc值传递
1.页面向后台传值 A.HttpServletRequest方式: package com.rong.controller; import javax.annotation.Resource; imp ...
- Centos上Apache重启,mysql重启,nginx重启方法
转载:http://www.3lian.com/edu/2012/04-01/24278.html Centos上Apache重启,mysql重启, nginx 重启方法 1.重启 apache se ...
- ASP.NET 页面访问控制
request常用对象和方法: @属性:1.quary string,获取通过URL路径传来的数据 2.Form,获取通过表单提交传输的数据 3.servervariables,获取Web服务器变量的 ...
- Delphi DbGridEh实现表格没有内容的渐变效果
OptionsEh = dghExtendVertLines 就会有这个效果, 去掉就会没有这个效果