题目描述 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
若该矩阵满足每一行每一列的字母都是字典序递增的则称S为优美的,如上述单词就是
优美的,而ADJPTBEGQUCKLRVFINSWHMOXY则不是(第二列不满足要求)。
Your Task
将所有优美的单词按字典序列出,从小到大编号1,2,……
请你完成以下两种任务:
1. 给定一个优美的单词,求其编号。
2. 给定一个编号,求对应的优美的单词。

输入描述
Input Description

第一行一个字母,W表示任务1,N表示任务2
若是任务1,第二行是一个优美的单词,否则第二行是一个正整数,表示某个优美的单
词的编号,保证该数不超过优美的单词的总数

输出描述
Output Description

一行,若是任务1,输出对应编号,否则输出对应的优美的单词

样例输入
Sample Input

W
ABCDEFGHIJKLMNOPQRSUTVWXY

样例输出
Sample Output

2

数据范围及提示
Data Size & Hint

样例输入二
N
20
样例输出二
ABCDEFGHIJKLMNOPQSUWRTVXY

 
 
正解:记忆化搜索
解题报告:
  今天考试T5,感觉好神啊,%%%。
  考虑直接搜索的话肯定会TLE,但我们可以想到一个点一定比他右下方的所有点权值小,这可以作为一个剪枝。
  那么考虑记忆化搜索,f[i][j][k][l1][l2]表示第一行摆了i个,第二行摆了j个,第三行摆了k个,第四行摆了l1个,第五行摆了l2个的方案数(保证五个数不降,才能保证合法性)
  然后我们如何操作呢?以N操作为例,因为我们想得到第n个字符串是什么,所以我们可以这么做:首先从1到25确定每一位填什么,比如说前三位填ABC,然后我算一下在前三位固定的情况下我统计一下这种情况的总方案数,如果大于n,那么说明前三位填ABC是可行的(因为如果已经大于n了,那么这一位再变大肯定更加大就不合法了,所以可以确定这一位就是当前搜索的数),然后继续往下找,直到发现当我确定到某一位发现小于n了,那么我就把这个方案数从n中减掉,然后我再把这一位稍微变大,再统计方案,不断反复。最后得到的序列就是我想要的序列。
  W操作也是类似的,只是每一位约束上界不能超过给定的字符串,最后统计方案,输出方案+1即可(要包括自己)。
 
 
 //It is made by jump~
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <ctime>
#include <vector>
#include <queue>
#include <map>
#include <set>
using namespace std;
typedef long long LL;
int n;
char cc,ch[];
int ans[];
int f[][][][][];
//f[i][j][k][l1][l2]表示第一行摆了i个,第二行摆了j个,第三行摆了k个,第四行摆了l1个,第五行摆了l2个的方案数,保证五个数不降,才能保证合法性 inline int getint()
{
int w=,q=; char c=getchar();
while((c<'' || c>'') && c!='-') c=getchar(); if(c=='-') q=,c=getchar();
while (c>='' && c<='') w=w*+c-'', c=getchar(); return q ? -w : w;
} inline bool check(int x,int num){ return (!ans[x]) || (ans[x]==num); } inline int dfs(int a,int b,int c,int d,int e,int tot){
if(tot==) return ;
int &tmp=f[a][b][c][d][e];
if(tmp) return tmp;
if(a< && check(a,tot+)) tmp+=dfs(a+,b,c,d,e,tot+); //填在第一行
if(b<a && check(b+,tot+)) tmp+=dfs(a,b+,c,d,e,tot+); //保证严格不降
if(c<b && check(c+,tot+)) tmp+=dfs(a,b,c+,d,e,tot+);
if(d<c && check(d+,tot+)) tmp+=dfs(a,b,c,d+,e,tot+);
if(e<d && check(e+,tot+)) tmp+=dfs(a,b,c,d,e+,tot+);
return tmp;
} inline void work(){
cc=getchar();
if(cc=='W') {
scanf("%s",ch);
for(int i=;i<;i++) {
for(ans[i]=;ans[i]<ch[i]-'A'+;ans[i]++) {
memset(f,,sizeof(f));
n+=dfs(,,,,,);
}
}
printf("%d",n+);//加上自己
}
else {
n=getint(); int now;
for(int i=;i<;i++) {
for(ans[i]=;ans[i]<=;ans[i]++) {//确定状态,搜索在当前状态下的答案数
memset(f,,sizeof(f));//随时清空
now=dfs(,,,,,);
if(now>=n) break;
n-=now;
}
}
for(int i=;i<;i++) printf("%c",ans[i]+'A'-);
}
} int main()
{
work();
return ;
}

codevs1322 单词矩阵的更多相关文章

  1. 【Codevs1322】单词矩阵

    Position: http://codevs.cn/problem/1322/ List Codevs1322 单词矩阵 List Description Input Output Sample I ...

  2. P1101 单词方阵(DFS)

    题目描述 给一n \times nn×n的字母方阵,内可能蕴含多个"yizhong"单词.单词在方阵中是沿着同一方向连续摆放的.摆放可沿着 88个方向的任一方向,同一单词摆放时不再 ...

  3. NLP之基于词嵌入(WordVec)的嵌入矩阵生成并可视化

    词嵌入 @ 目录 词嵌入 1.理论 1.1 为什么使用词嵌入? 1.2 词嵌入的类比推理 1.3 学习词嵌入 1.4 Word2Vec & Skip-Gram(跳字模型) 1.5 分级& ...

  4. 第四次作业——WORDSEARCH小游戏

    “谁想出来的这么缺德的题目啊!!!!”一个声音在我心中回荡 这个题目很早就在课堂上公布了,我和我的小伙伴都惊呆了! 这是个毛?根本无从下手的感觉 总是觉得这个小游戏不是程序能给出答案的,因为我的第一印 ...

  5. 【NLP CS224N笔记】Lecture 2 - Word Vector Representations: word2vec

    I. Word meaning Meaning的定义有很多种,其中有: the idea that is represented by a word,phrase,etc. the idea that ...

  6. 词向量之Word2vector原理浅析

    原文地址:https://www.jianshu.com/p/b2da4d94a122 一.概述 本文主要是从deep learning for nlp课程的讲义中学习.总结google word2v ...

  7. Semantic Compositionality through Recursive Matrix-Vector Spaces-paper

    Semantic Compositionality through Recursive Matrix-Vector Spaces 作者信息:Richard Socher Brody Huval Chr ...

  8. 机器学习与R语言:NB

    #---------------------------------------- # 功能描述:演示NB建模过程 # 数据集:SMS文本信息 # tm包:维也纳财经大学提供 #----------- ...

  9. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

随机推荐

  1. Nginx反向代理+负载均衡简单实现(http方式)

    1)nginx的反向代理:proxy_pass2)nginx的负载均衡:upstream 下面是nginx的反向代理和负载均衡的实例: 负载机:A机器:103.110.186.8/192.168.1. ...

  2. Spring小练习之宝宝淘项目

    数据库准备 # 表结构 CREATE TABLE `t01_user` ( `) NOT NULL AUTO_INCREMENT COMMENT '自增主键', `) DEFAULT NULL COM ...

  3. usb驱动开发3之先看core

    上节中看到usb目录中有一个core目录,凡是认识这个core单词的人都会想要先看看它是什么,对不?用LDD3中一幅图,来表述usb core所处地位. usb core负责实现一些核心的功能,为别的 ...

  4. The Linux Storage Stack Diagram

    相关文章: 如何提高Linux下块设备IO的整体性能?

  5. 未能进入中断模式,原因如下:源文件“XXXXXX”不属于正在调试的项目。

    这个问题是由于项目文件位置变动导致的.提示框已经说的比较清楚了. 首先可以尝试[重新生成] ,一般可以解决这个问题了. 我遇到的情况是,设置配置时,不小心取消了生成选择. 所以打开配置管理器,把相关的 ...

  6. MySQL基础 - 注意事项

    AND比OR优先级高,故在同时使用AND和OR进行查找时记得加上小括号,当同时存在多个条件时统一加上括号是个好习惯. NULL不参与搜索,即使使用LIKE '%'也匹配不到值为NULL的记录. LIK ...

  7. IBatis.Net学习笔记十三:在IBatis.Net中调用存储过程

    其实调用方式比较简单,主要也就是两种类型的存储过程:1.更新类型的存储过程2.查询类型的存储过程下面就来看看具体的调用方式:1.更新类型的存储过程sp_InsertAccount: CREATE PR ...

  8. LINUX下C语言编程基础

    实验二 Linux下C语言编程基础 一.实验目的 1. 熟悉Linux系统下的开发环境 2. 熟悉vi的基本操作 3. 熟悉gcc编译器的基本原理 4. 熟练使用gcc编译器的常用选项 5 .熟练使用 ...

  9. Win7下手动卸载oracle 11G

    由于安装过程中遇到的之前提到的那个问题,http://www.cnblogs.com/shenliang123/p/3141886.html  知道解决方法后,也只能将oracle重新卸载后再进行安装 ...

  10. 数据挖掘系列(2)--关联规则FpGrowth算法

    上一篇介绍了关联规则挖掘的一些基本概念和经典的Apriori算法,Aprori算法利用频繁集的两个特性,过滤了很多无关的集合,效率提高不少,但是我们发现Apriori算法是一个候选消除算法,每一次消除 ...