Position:

  • http://codevs.cn/problem/1322/

List

  • Codevs1322 单词矩阵

    • List
    • Description
    • Input
    • Output
    • Sample Input
    • Sample Output
    • HINT
    • Solution
    • Code

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

  1. W
    ABCDEFGHIJKLMNOPQRSUTVWXY
  2. N
    20

Sample Output

  1. 2
  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

 1 // <twofive.cpp> - Mon Sep 19 08:11:51 2016
 2 // This file is made by YJinpeng,created by XuYike's black technology automatically.
 3 // Copyright (C) 2016 ChangJun High School, Inc.
 4 // I don't know what this program is.
 5
 6 #include <iostream>
 7 #include <vector>
 8 #include <algorithm>
 9 #include <cstring>
10 #include <cstdio>
11 #include <cstdlib>
12 #include <cmath>
13 #define MOD 1000000007
14 #define INF 1e9
15 using namespace std;
16 typedef long long LL;
17 const int MAXN=6;
18 const int MAXM=36;
19 inline int max(int &x,int &y) {return x>y?x:y;}
20 inline int min(int &x,int &y) {return x<y?x:y;}
21 inline int gi() {
22     register int w=0,q=0;register char ch=getchar();
23     while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
24     if(ch=='-')q=1,ch=getchar();
25     while(ch>='0'&&ch<='9')w=w*10+ch-'0',ch=getchar();
26     return q?-w:w;
27 }
28 char s[MAXM];int ans[MAXM];
29 int f[MAXN][MAXN][MAXN][MAXN][MAXN];
30 inline bool check(int x,int c){return ans[x]?ans[x]==c:1;}
31 inline int src(int a,int b,int c,int d,int e,int tot){
32     if(tot==25)return 1;
33     int &tmp=f[a][b][c][d][e];
34     if(tmp)return tmp;
35     if(a<5&&check(a,tot+1))tmp+=src(a+1,b,c,d,e,tot+1);
36     if(b<a&&check(b+5,tot+1))tmp+=src(a,b+1,c,d,e,tot+1);
37     if(c<b&&check(c+10,tot+1))tmp+=src(a,b,c+1,d,e,tot+1);
38     if(d<c&&check(d+15,tot+1))tmp+=src(a,b,c,d+1,e,tot+1);
39     if(e<d&&check(e+20,tot+1))tmp+=src(a,b,c,d,e+1,tot+1);
40     return tmp;
41 }
42 int main()
43 {
44     freopen("twofive.in","r",stdin);
45     freopen("twofive.out","w",stdout);
46     char type=getchar();int n=0;
47     if(type=='W'){
48         scanf("%s",s);
49         for(int i=0;i<25;i++)
50             for(ans[i]=1;ans[i]<s[i]-'A'+1;ans[i]++){
51                 memset(f,0,sizeof(f));
52                 n+=src(0,0,0,0,0,0);
53             }
54         printf("%d",n+1);
55     }else{
56         n=gi();
57         for(int i=0;i<25;i++)
58             for(ans[i]=1;ans[i]<=26;ans[i]++){
59                 memset(f,0,sizeof(f));
60                 int now=src(0,0,0,0,0,0);
61                 if(now>=n)break;n-=now;
62             }
63         for(int i=0;i<25;i++)putchar(int(ans[i]+'A'-1));
64     }
65     return 0;
66 }

View Code

小优化-s

 1 // <twofive.cpp> - Mon Sep 19 08:11:51 2016
 2 // This file is made by YJinpeng,created by XuYike's black technology automatically.
 3 // Copyright (C) 2016 ChangJun High School, Inc.
 4 // I don't know what this program is.
 5
 6 #include <iostream>
 7 #include <vector>
 8 #include <algorithm>
 9 #include <cstring>
10 #include <cstdio>
11 #include <cstdlib>
12 #include <cmath>
13 #define MOD 1000000007
14 #define INF 1e9
15 using namespace std;
16 typedef long long LL;
17 const int MAXN=6;
18 const int MAXM=36;
19 inline int max(int &x,int &y) {return x>y?x:y;}
20 inline int min(int &x,int &y) {return x<y?x:y;}
21 inline int gi() {
22     register int w=0,q=0;register char ch=getchar();
23     while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
24     if(ch=='-')q=1,ch=getchar();
25     while(ch>='0'&&ch<='9')w=w*10+ch-'0',ch=getchar();
26     return q?-w:w;
27 }
28 char s[MAXM];int ans[MAXM],used[MAXM];
29 int f[MAXN][MAXN][MAXN][MAXN][MAXN];
30 inline bool check(int x,int c){return ans[x]?ans[x]==c:1;}
31 inline int src(int a,int b,int c,int d,int e,int tot){
32     if(tot==25)return 1;
33     int &tmp=f[a][b][c][d][e];
34     if(tmp)return tmp;
35     if(a<5&&check(a,tot+1))tmp+=src(a+1,b,c,d,e,tot+1);
36     if(b<a&&check(b+5,tot+1))tmp+=src(a,b+1,c,d,e,tot+1);
37     if(c<b&&check(c+10,tot+1))tmp+=src(a,b,c+1,d,e,tot+1);
38     if(d<c&&check(d+15,tot+1))tmp+=src(a,b,c,d+1,e,tot+1);
39     if(e<d&&check(e+20,tot+1))tmp+=src(a,b,c,d,e+1,tot+1);
40     return tmp;
41 }
42 int main()
43 {
44     freopen("twofive.in","r",stdin);
45     freopen("twofive.out","w",stdout);
46     char type=getchar();int n=0;
47     memset(used,false,sizeof(used));
48     if(type=='W'){
49         scanf("%s",s);
50         for(int i=0;i<25;i++){
51             for(ans[i]=1;ans[i]<s[i]-'A'+1;ans[i]++){
52                 if(used[ans[i]])continue;
53                 memset(f,0,sizeof(f));
54                 n+=src(0,0,0,0,0,0);
55             }
56             used[ans[i]]=1;
57         }
58         printf("%d",n+1);
59     }else{
60         n=gi();
61         for(int i=0;i<25;i++){
62             for(ans[i]=1;ans[i]<=26;ans[i]++){
63                 if(used[ans[i]])continue;
64                 memset(f,0,sizeof(f));
65                 int now=src(0,0,0,0,0,0);
66                 if(now>=n)break;n-=now;
67             }
68             used[ans[i]]=1;
69         }
70         for(int i=0;i<25;i++)putchar(int(ans[i]+'A'-1));
71     }
72     return 0;
73 }

View Code

这里不得不再提起常数优化,算法优化,小优化→大分数。这点意识真的要有,说不准快了0.01s你就多过了10分,说不准多十分你就保送,进队,金牌,一等奖,降分……

来看下效果:

之后

转载于:https://www.cnblogs.com/YJinpeng/p/5907200.html

【Codevs1322】单词矩阵相关推荐

  1. 程序员面试金典 - 面试题 17.25. 单词矩阵(Trie树+DFS回溯,hard)

    1. 题目 给定一份单词的清单,设计一个算法,创建由字母组成的面积最大的矩形,其中每一行组成一个单词(自左向右),每一列也组成一个单词(自上而下). 不要求这些单词在清单里连续出现,但要求所有行等长, ...

  2. P1101 单词方阵(DFS)

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

  3. LeetCode 425. 单词方块(Trie树+DFS)

    文章目录 1. 题目 2. 解题 1. 题目 给定一个单词集合 (没有重复),找出其中所有的 单词方块 . 一个单词序列形成了一个有效的单词方块的意思是指从第 k 行和第 k 列 (0 ≤ k < ...

  4. 百面机器学习之特征工程

    1.为什么需要对数值类型的特征做归一化? 为了消除数据特征之间的量纲影响,我们需要对特征进行归一化处理,使得不同指标之间具有可比性. 对数值类型的特征做归一化可以将所有的特征都统一到一个大致相同的数值 ...

  5. 第一篇: 词向量之Word2vector原理浅析

    第一篇: 词向量之Word2vector原理浅析 作者 Aroundtheworld 2016.11.05 18:50 字数 1353 阅读 5361评论 1喜欢 9 一.概述 本文主要是从deep ...

  6. Hadoop_23_MapReduce倒排索引实现

    1.1.倒排索引  根据属性的值来查找记录.这种索引表中的每一项都包括一个属性值和具有该属性值的各记录的地址.由于不是由记录来确 定属性值,而是由属性值来确定记录的位置,因而称为倒排索引(invert ...

  7. 词向量之Word2vector原理浅析

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

  8. 【机器学习实战】第4章 朴素贝叶斯(Naive Bayes)

    第4章 基于概率论的分类方法:朴素贝叶斯 朴素贝叶斯 概述 贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类.本章首先介绍贝叶斯分类算法的基础--贝叶斯定理.最后,我们 ...

  9. 实现贝叶斯分类器_机器学习实战项目-朴素贝叶斯

    朴素贝叶斯 概述 贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类.本章首先介绍贝叶斯分类算法的基础--贝叶斯定理.最后,我们通过实例来讨论贝叶斯分类的中最简单的一种: ...

最新文章

  1. 判定是否互为字符重排
  2. ICLR 2022 under review|化学反应感知的分子表征学习
  3. 后盾网lavarel视频项目---1、数据迁移
  4. 苹果,你拿什么勇气来跟 Android 比?
  5. java布类型的常量,java数据类型;常量与变量;
  6. php 简单日志搜索
  7. 自动化测试与DevOps以及持续集成的关系。
  8. sqlserver 两个数值字段相加_SQLServer 中多行数据合并成一行数据(一个字段)
  9. Python虚拟机之if控制流(一)
  10. 《态度》- 吴军 四十封启明家书 读后感
  11. Python数据结构,线性结构:栈、队列、双端队列、列表
  12. Spatial Transformer Networks(STN)-代码实现
  13. geogebra软件使用总结
  14. getch(),getche()和getchar()使用区别
  15. 淘宝网自主开发数据存储系统
  16. IDEA推送项目到gitee上,拉取gitee项目到IDEA中
  17. 外连接 及 无用的外连接
  18. 函数有参无参真有很大区别吗?
  19. 冒泡排序python_冒是什么意思、发音和在线翻译 - 英语单词大全 - 911查询
  20. itext设置字体间距_Word涨薪第五十四式:解决无法调整行间距的情况

热门文章

  1. 关于VB中没有VSS菜单问题
  2. 变量可以通过into赋值
  3. BZOJ2115: [Wc2011] Xor
  4. 如何解决普通用户使用sudo找不到命令
  5. Bitmap基本概念及在Android4.4系统上使用BitmapFactory的注意事项
  6. MB51升级后输入框的名字显示数据字段名
  7. 如何使窗体不重复被打开
  8. 解决:Sublime Text3 packagecontrol.io 无法访问的问题
  9. 3org.springframework.beans.factory.BeanDefinitionStoreException异常
  10. 深入全面探究有未经处理的异常: 0xC00000FD: Stack overflow(栈溢出)问题!