题目描述 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. css中position属性(absolute|relative|static|fixed)概述及应用

    position属性的相关定义: static:无特殊定位,对象遵循正常文档流; relative:对象遵循正常文档流; absolute:对象脱离正常文档流 fixed:对象脱离正常文档流 我们先来 ...

  2. 纯CSS3制作九款可爱复古相机

    前言 掐指一算,快两个月没写博客分享了.好吧,我就只是在准备校招而已.现在已经有满意的offer了,所以我就回来啦!这两个月过得挺煎熬也挺充实的.具体细说估计得长篇大论,我就不闲扯了.总之呢,越努力, ...

  3. springmvc源码分析(转)

    该博客转载自http://www.cnblogs.com/heavenyes/p/3905844.html#特在此说明!!!!! springmvc是一个基于spring的web框架.本篇文章对它的工 ...

  4. RelayCommand命令

    原文:http://www.cnblogs.com/xiepeixing/archive/2013/08/13/3255152.html 常用Wpf开发中我们在ViewModel中实现INotifyP ...

  5. Go cron定时任务的用法

    cron是什么 cron的意思就是:计划任务,说白了就是定时任务.我和系统约个时间,你在几点几分几秒或者每隔几分钟跑一个任务(job),就那么简单. cron表达式 cron表达式是一个好东西,这个东 ...

  6. C语言 指针与字符串

    C语言可以在栈区 or 堆区 or 全局区 存放字符串,字符串不单单是存储在全局区的. //字符串与指针 #include<stdio.h> #include<stdlib.h> ...

  7. C#中成员初始化顺序

    http://blog.csdn.net/huangcailian/article/details/25958967 一.成员初始化整体顺序 1.成员赋值初始化先于构造函数: 2.成员赋值初始先从子类 ...

  8. linux内核分析 第八周

    第八周 理解进程调度时机跟踪分析进程调度与进程切换的过程 一.进程调度与切换 1.进程的调度时机与进程切换 操作系统原理中介绍了大量进程调度算法,这些算法从实现的角度看仅仅是从运行队列中选择一个新进程 ...

  9. iOS—— static和const联合使用;使用static const 与 #define

    static和const联合使用:   static将一个全局变量变成局部变量   const将一个局部变量变成局部常量 // 定义了一个局部常量      static const CGFloat ...

  10. pythonchallenge(三)

    PythonChallenge_3 一.实验说明 1. 环境登录 无需密码自动登录,系统用户名shiyanlou,密码shiyanlou 2. 环境介绍 本实验环境采用带桌面的Ubuntu Linux ...