【Codevs1322】单词矩阵
Position:
List
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
第一行一个字母,W表示任务1,N表示任务2
若是任务1,第二行是一个优美的单词,否则第二行是一个正整数,表示某个优美的单词的编号,保证该数不超过优美的单词的总数
Output
一行,若是任务1,输出对应编号,否则输出对应的优美的单词
Sample Input
- W
ABCDEFGHIJKLMNOPQRSUTVWXY - N
20
Sample Output
- 2
- ABCDEFGHIJKLMNOPQSUWRTVXY
HINT
无
Solution
普通搜索显然TLE(枚举每一位填什么字母O(26!))
注意条件每一行每一列的字母都是字典序递增→每个字母必须小于右下方所有的字母
考虑从A到Z依次填入矩阵0~24中,记忆化搜索f[a][b][c][d][e]记录当前状态后继方案数,满足a>b>c>d>e,并且当前已经填入的数要是原样,src(a,b,c,d,e,tot)tot记录要填入哪个字母。
对于第一个任务,求编号,那么每个位置可以填1~s[i]-‘A’+1,统计之前的方案数,最终方案数加上自己即可+1。
对于第二个任务,求方案,那么每个位置从’A’开始填,知道>n,最终求出的即为结果。
码题解的时候发现如果用过的字母就不要用了,加上优化发现快了不少。
Code
// <twofive.cpp> - Mon Sep 19 08:11:51 2016
// This file is made by YJinpeng,created by XuYike's black technology automatically.
// Copyright (C) 2016 ChangJun High School, Inc.
// I don't know what this program is. #include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#define MOD 1000000007
#define INF 1e9
using namespace std;
typedef long long LL;
const int MAXN=;
const int MAXM=;
inline int max(int &x,int &y) {return x>y?x:y;}
inline int min(int &x,int &y) {return x<y?x:y;}
inline int gi() {
register int w=,q=;register char ch=getchar();
while((ch<''||ch>'')&&ch!='-')ch=getchar();
if(ch=='-')q=,ch=getchar();
while(ch>=''&&ch<='')w=w*+ch-'',ch=getchar();
return q?-w:w;
}
char s[MAXM];int ans[MAXM];
int f[MAXN][MAXN][MAXN][MAXN][MAXN];
inline bool check(int x,int c){return ans[x]?ans[x]==c:;}
inline int src(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+=src(a+,b,c,d,e,tot+);
if(b<a&&check(b+,tot+))tmp+=src(a,b+,c,d,e,tot+);
if(c<b&&check(c+,tot+))tmp+=src(a,b,c+,d,e,tot+);
if(d<c&&check(d+,tot+))tmp+=src(a,b,c,d+,e,tot+);
if(e<d&&check(e+,tot+))tmp+=src(a,b,c,d,e+,tot+);
return tmp;
}
int main()
{
freopen("twofive.in","r",stdin);
freopen("twofive.out","w",stdout);
char type=getchar();int n=;
if(type=='W'){
scanf("%s",s);
for(int i=;i<;i++)
for(ans[i]=;ans[i]<s[i]-'A'+;ans[i]++){
memset(f,,sizeof(f));
n+=src(,,,,,);
}
printf("%d",n+);
}else{
n=gi();
for(int i=;i<;i++)
for(ans[i]=;ans[i]<=;ans[i]++){
memset(f,,sizeof(f));
int now=src(,,,,,);
if(now>=n)break;n-=now;
}
for(int i=;i<;i++)putchar(int(ans[i]+'A'-));
}
return ;
}
小优化-s
// <twofive.cpp> - Mon Sep 19 08:11:51 2016
// This file is made by YJinpeng,created by XuYike's black technology automatically.
// Copyright (C) 2016 ChangJun High School, Inc.
// I don't know what this program is. #include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#define MOD 1000000007
#define INF 1e9
using namespace std;
typedef long long LL;
const int MAXN=;
const int MAXM=;
inline int max(int &x,int &y) {return x>y?x:y;}
inline int min(int &x,int &y) {return x<y?x:y;}
inline int gi() {
register int w=,q=;register char ch=getchar();
while((ch<''||ch>'')&&ch!='-')ch=getchar();
if(ch=='-')q=,ch=getchar();
while(ch>=''&&ch<='')w=w*+ch-'',ch=getchar();
return q?-w:w;
}
char s[MAXM];int ans[MAXM],used[MAXM];
int f[MAXN][MAXN][MAXN][MAXN][MAXN];
inline bool check(int x,int c){return ans[x]?ans[x]==c:;}
inline int src(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+=src(a+,b,c,d,e,tot+);
if(b<a&&check(b+,tot+))tmp+=src(a,b+,c,d,e,tot+);
if(c<b&&check(c+,tot+))tmp+=src(a,b,c+,d,e,tot+);
if(d<c&&check(d+,tot+))tmp+=src(a,b,c,d+,e,tot+);
if(e<d&&check(e+,tot+))tmp+=src(a,b,c,d,e+,tot+);
return tmp;
}
int main()
{
freopen("twofive.in","r",stdin);
freopen("twofive.out","w",stdout);
char type=getchar();int n=;
memset(used,false,sizeof(used));
if(type=='W'){
scanf("%s",s);
for(int i=;i<;i++){
for(ans[i]=;ans[i]<s[i]-'A'+;ans[i]++){
if(used[ans[i]])continue;
memset(f,,sizeof(f));
n+=src(,,,,,);
}
used[ans[i]]=;
}
printf("%d",n+);
}else{
n=gi();
for(int i=;i<;i++){
for(ans[i]=;ans[i]<=;ans[i]++){
if(used[ans[i]])continue;
memset(f,,sizeof(f));
int now=src(,,,,,);
if(now>=n)break;n-=now;
}
used[ans[i]]=;
}
for(int i=;i<;i++)putchar(int(ans[i]+'A'-));
}
return ;
}
这里不得不再提起常数优化,算法优化,小优化→大分数。这点意识真的要有,说不准快了0.01s你就多过了10分,说不准多十分你就保送,进队,金牌,一等奖,降分……
来看下效果:
之后
【Codevs1322】单词矩阵的更多相关文章
- codevs1322 单词矩阵
题目描述 Description 对于包含字母A到Y各一次的单词S,将其从上到下从左到右写在一个5*5的矩阵中,如单词ADJPTBEKQUCGLRVFINSWHMOXY写出来如下: A D J P T ...
- P1101 单词方阵(DFS)
题目描述 给一n \times nn×n的字母方阵,内可能蕴含多个"yizhong"单词.单词在方阵中是沿着同一方向连续摆放的.摆放可沿着 88个方向的任一方向,同一单词摆放时不再 ...
- NLP之基于词嵌入(WordVec)的嵌入矩阵生成并可视化
词嵌入 @ 目录 词嵌入 1.理论 1.1 为什么使用词嵌入? 1.2 词嵌入的类比推理 1.3 学习词嵌入 1.4 Word2Vec & Skip-Gram(跳字模型) 1.5 分级& ...
- 第四次作业——WORDSEARCH小游戏
“谁想出来的这么缺德的题目啊!!!!”一个声音在我心中回荡 这个题目很早就在课堂上公布了,我和我的小伙伴都惊呆了! 这是个毛?根本无从下手的感觉 总是觉得这个小游戏不是程序能给出答案的,因为我的第一印 ...
- 【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 ...
- 词向量之Word2vector原理浅析
原文地址:https://www.jianshu.com/p/b2da4d94a122 一.概述 本文主要是从deep learning for nlp课程的讲义中学习.总结google word2v ...
- Semantic Compositionality through Recursive Matrix-Vector Spaces-paper
Semantic Compositionality through Recursive Matrix-Vector Spaces 作者信息:Richard Socher Brody Huval Chr ...
- 机器学习与R语言:NB
#---------------------------------------- # 功能描述:演示NB建模过程 # 数据集:SMS文本信息 # tm包:维也纳财经大学提供 #----------- ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
随机推荐
- JDBC配置MSSQL
使用JDBC连接SQL SERVER 这可能是个很老套的话题,但不管怎么说还是有用的.姑且把配置方法贴出来吧.1. 确认Sql Server的的运行状态打开Sql Server配置管理器,确认Sql ...
- 关于Linux字符集的查看及修改
一·查看字符集 字符集在系统中体现形式是一个环境变量,其查看当前终端使用字符集的方式可以有以下几种方式: 1.[root@ ~]# echo $LANG en_US.UTF-8 ...
- Linux mpstat-显示各个可用CPU的状态
更多linux 性能监测与优化 关注:linux命令大全 mpstat命令指令主要用于多CPU环境下,它显示各个可用CPU的状态系你想.这些信息存放在/proc/stat文件中.在多CPUs系统里,其 ...
- Divide Groups 二分图的判定
Divide Groups Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- [spoj1182][Sorted Bit Sequence] (数位dp)
Description Let's consider the 32 bit representation of all integers i from m up to n inclusive (m ≤ ...
- tomcat配置虚拟目录实现无项目名访问项目,域名直接访问
1.tomcat下新建文件夹名为 myapp,把编译后的项目放入该文件夹,不是war包. 2.conf/Catalina/localhost目录下,新建一个ROOT.xml文件,写入类似于如下内容 & ...
- 如何绘制caffe网络训练曲线
本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/51774966 当我们设计好网络结构后, ...
- yarn & vue-cli
yarn & vue-cli https://github.com/xgqfrms/ES6/issues/10 install https://yarnpkg.com/zh-Hans/docs ...
- 线段树题集 (cf版)
lazy区间修改 : http://acm.hdu.edu.cn/showproblem.php?pid=4902 (hdu4902) http://acm.hdu.edu.cn/showpr ...
- RMQ 模板一份
;i<n;i++) d[i][]=A[i]; ;(<<j)<=n;j++) ;i+(<<j)-<n;i++) ],d[i+(<<(j-))][j- ...