题目描述 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. Unity3D MainCamera和NGUI UICamera的小插曲

    集成NGUI 在实际的项目中,经常会使用NGUI来制作UI,用Main Camera来表现3D,但是NGUI的Camer的投射是正交视图而非透视,它绑定UICamer的脚本而且它的Tag默认是Unta ...

  2. dos系统下mysql常用命令

    show table status;//查看所有表状态,通过这个命令可以得知表的创建时间和最后更新时间,以及该表是基表还是视图以及是什么表引擎等信息. show table status from d ...

  3. Netty开发UDP协议

    UdpServer package org.zln.netty.five.part07; import io.netty.bootstrap.Bootstrap; import io.netty.ch ...

  4. 3016 质子撞击炮 II

    3016 质子撞击炮 II  时间限制: 1 s  空间限制: 32000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Description [抱歉数据错误~~已修 ...

  5. 【转】【Asp.Net】asp.net服务器控件创建

    VS新建一个Web服务控件工程,会默认生成以下代码: namespace WebControlLibrary { [DefaultProperty("Text")] [Toolbo ...

  6. C语言 文件操作3--文件重定向与扫描

    //文件重定向和扫描 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> //fprint ...

  7. 泛型委托 Predicate/Func/Action

    Predicate 泛型委托  表示定义一组条件并确定指定对象是否符合这些条件的方法.此委托由 Array 和 List 类的几种方法使用,用于在集合中搜索元素.看看下面它的定义: // Summar ...

  8. ZooKeeper学习第七期--ZooKeeper一致性原理

    一.ZooKeeper 的实现 1.1 ZooKeeper处理单点故障 我们知道可以通过ZooKeeper对分布式系统进行Master选举,来解决分布式系统的单点故障,如图所示. 图 1.1 ZooK ...

  9. ZooKeeper学习第三期---Zookeeper命令操作

    一.Zookeeper的四字命令 Zookeeper支持某些特定的四字命令字母与其的交互.他们大多数是查询命令,用来获取Zookeeper服务的当前状态及相关信息.用户在客户端可以通过telnet或n ...

  10. Linux 下,mysql数据库报无法登陆错误:ERROR 1045 (28000): Access denied for use

    今天在别人的服务器上登录mysql发现无法登陆(Mysql别人实现安装好的) 密码和用户名都是正确的,但登录后报如下错误: ERROR 1045 (28000): Access denied for ...