洛谷题目链接:[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的更多相关文章

  1. 洛谷P1345 [USACO5.4]奶牛的电信Telecowmunication【最小割】分析+题解代码

    洛谷P1345 [USACO5.4]奶牛的电信Telecowmunication[最小割]分析+题解代码 题目描述 农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流. ...

  2. [洛谷P1709] [USACO5.5]隐藏口令Hidden Password

    洛谷题目链接:[USACO5.5]隐藏口令Hidden Password 题目描述 有时候程序员有很奇怪的方法来隐藏他们的口令.Binny会选择一个字符串S(由N个小写字母组成,5<=N< ...

  3. [洛谷P2747] [USACO5.4]周游加拿大Canada Tour

    洛谷题目链接:[USACO5.4]周游加拿大Canada Tour 题目描述 你赢得了一场航空公司举办的比赛,奖品是一张加拿大环游机票.旅行在这家航空公司开放的最西边的城市开始,然后一直自西向东旅行, ...

  4. [洛谷P2745] [USACO5.3]窗体面积Window Area

    洛谷题目链接:[USACO5.3]窗体面积Window Area 题目描述 你刚刚接手一项窗体界面工程.窗体界面还算简单,而且幸运的是,你不必显示实际的窗体.有 5 种基本操作: 创建一个新窗体 将窗 ...

  5. 洛谷 P2701 [USACO5.3]巨大的牛棚Big Barn Label:二维数组前缀和 你够了 这次我用DP

    题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N ...

  6. 洛谷1345 [Usaco5.4]奶牛的电信

    题目描述 农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流.这些机器用如下的方式发送电邮:如果存在一个由c台电脑组成的序列a1,a2,...,a(c),且a1与a2相 ...

  7. P2750 贰五语言Two Five USACO5.5 记忆化搜索

    正解:记搜+逼近 解题报告: 神仙题预警,,, 我真滴觉得还是挺难的了,,, 大概说下思路趴QAQ 首先我们要知道逼近法是什么! 逼近法,有点像二分的思路,以这题为例举个eg 假如它给了个数字k.我们 ...

  8. 洛谷 P2746 [USACO5.3]校园网Network of Schools 解题报告

    P2746 [USACO5.3]校园网Network of Schools 题目描述 一些学校连入一个电脑网络.那些学校已订立了协议:每个学校都会给其它的一些学校分发软件(称作"接受学校&q ...

  9. 洛谷——P1345 [USACO5.4]奶牛的电信Telecowmunication

    P1345 [USACO5.4]奶牛的电信Telecowmunication 题目描述 农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流.这些机器用如下的方式发送电邮 ...

随机推荐

  1. MacOS下搭建python环境

    1. 安装须知 Mac OS自身其实已经带有Python,版本为2.7.X,这个Python主要用于支持系统文件和XCode,所以我们在安装新的Python版本时候最好不要影响这部分. 这里就会出现一 ...

  2. ERROR----java.lang.NoClassDefFoundError: org/apache/commons/lang3/StringUtils

    2013-4-28 13:17:57 org.apache.catalina.core.StandardContext filterStart 严重: Exception starting filte ...

  3. VK Cup 2015 - Round 2 (unofficial online mirror, Div. 1 only) B. Work Group 树形dp

    题目链接: http://codeforces.com/problemset/problem/533/B B. Work Group time limit per test2 secondsmemor ...

  4. HDU 5154 Harry and Magical Computer 有向图判环

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5154 题解: 有向图判环. 1.用dfs,正在访问的节点标记为-1,已经访问过的节点标记为1,没有访 ...

  5. 2nd 阅读构建之法有感

    阅读构建之法有感 利用这一周的时间,我大致了解构建之法一书,这本书带我走进了一个全新的领域.它让我以一种新的视角去了解软件产业的发展和工作,领略软件工程的独特魅力,更给出了简单易懂的方式去理解何为软件 ...

  6. Laravel中如何添加新字段,如何指定在某个字段后而不是添加在最后

    解答:

  7. phaser2 微信小游戏入手

    phaser2小游戏基本没什么什么问题,可以下常开发游戏.如果遇到什么问题, 可以提出来共同讨论. 下面来个例子 import './lib/weapp-adapter'; import Phaser ...

  8. Mysql 学习之 SQL的执行顺序

    mysql的json查询:                                                                       1.一条普通的SQL SELEC ...

  9. vue & $data & data

    vue & $data & data vm.a === vm.$data.a https://vuejs.org/v2/api/#data https://flaviocopes.co ...

  10. angularjs 常用功能练习

    <!DOCTYPE html> <html ng-app="app"> <head> <meta charset="utf-8& ...