1522 上下序列 
题目来源:  CodeForces
基准时间限制:1 秒 空间限制:131072 KB 分值: 80  难度:5级算法题

 收藏
 关注

现在有1到n的整数,每一种有两个。要求把他们排在一排,排成一个2*n长度的序列,排列的要求是从左到右看,先是不降,然后是不升。

特别的,也可以只由不降序列,或者不升序列构成。

例如,下面这些序列都是合法的:

·        [1,2,2,3,4,4,3,1];

·        [1,1];

·        [2,2,1,1];

·        [1,2,3,3,2,1].

除了以上的条件以外,还有一些其它的条件,形如"h[xi] signi h[yi]",这儿h[t]表示第t个位置的数字,signi是下列符号之一:'=' (相等), '<' (小于), '>' (大于), '<=' (小于等于), '>=' (大于等于)。这样的条件有k个。

请计算一下有多少种序列满足条件。

Input
单组测试数据。
第一行有两个整数 n 和k (1≤n≤35, 0≤k≤100),表示数字的种类和限制条件的数目。
接下来k行,每一行的输入格式是这样的:"xi signi yi" (1≤xi,yi≤2*n),signi是上面五种符号中的一种。
Output
输出一个整数,表示有多少种序列满足条件。
Input示例
样例输入1
3 0
样例输入2
3 1
2 > 3
Output示例
样例输出1
9
样例输出2
1

题解:那么晚没心情打,直接copy一波吧。

点击打开链接

这道题主要的思路是区间DP。每次把两个相同的数字填进已有的序列[l, r]中。

但是由于题目中有这些限制,显然不能瞎填对吧……那么怎么判断能不能这样填呢?

方便起见,从大到小、从中间到两边填(因为原题要求中间比两边大)。
既然后填的、两边的数一定比先填的、中间的数小,那么只需判断当前要填的位置是否有“大于、大于等于、或等于已经填的区间内的元素”的限制就好了。另外,当前填的两个元素中,不能有“一个大于另一个”的限制。

具体来说,如果用dp[i][j]表示填满区间[i, j]的方案数,check(a, b, l, r) == 1 表示a、b不会“大于、大于等于、或等于[l, r]内的元素”且没有"a>b“或”b>a"的限制。
那么:
若都填到左边:if(check(i, i + 1, i + 2, j)) dp[i][j] += dp[i + 2][j]
若都填到右边:if(check(j - 1, j, i, j - 2)) dp[i][j] += dp[i][j - 2]
若两边各填一个: if(check(i, j, i + 1, j - 1)) dp[i][j] += dp[i + 1][j - 1]

PS:有一个点要注意一下,它说的每次插入两个数是指两个相同的数(这在它的判断里会体现的

代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
#define INF 0x3f3f3f3f
#define space putchar(' ')
#define enter putchar('\n')
template <class T>
bool read(T &x){char c;bool minus = 0;while(c = getchar(), c < '0' || c > '9')if(c == '-') minus = 1;else if(c == EOF) return 0;x = c - '0';while(c = getchar(), c >= '0' && c <= '9')x = x * 10 + c - '0';if(minus) x = -x;return 1;
}
template <class T>
void write(T x){if(x < 0) putchar('-'), x = -x;if(x >= 10) write(x / 10);putchar('0' + x % 10);
}const int N = 80, K = 105;
int n, k;
int lar[N][K], leq[N][K], equ[N][K];
ll dp[N][N];void init(){read(n), read(k);int a, b;char sig[2];while(k--){sig[0] = sig[1] = 0;read(a), scanf("%s", sig), read(b);if(sig[0] == '=') equ[a][++equ[a][0]] = b, equ[b][++equ[b][0]] = a;else{if(sig[0] == '<') swap(a, b);if(sig[1] == '=') leq[a][++leq[a][0]] = b;else lar[a][++lar[a][0]] = b;}}
}
bool single_check(int a, int b, int l, int r){for(int i = 1; i <= lar[a][0]; i++)if((lar[a][i] <= r && lar[a][i] >= l) || lar[a][i] == b)return 0;for(int i = 1; i <= leq[a][0]; i++)if(leq[a][i] <= r && leq[a][i] >= l)return 0;for(int i = 1; i <= equ[a][0]; i++)if(equ[a][i] <= r && equ[a][i] >= l)return 0;return 1;
}
bool check(int a, int b, int l, int r){return single_check(a, b, l, r) && single_check(b, a, l, r);
}int main(){init();for(int i = 1; i < 2 * n; i++) if(check(i, i + 1, 0, 0)) dp[i][i + 1] = 1;for(int len = 2; len <= 2 * n; len += 2)for(int i = 1; i + len - 1 <= 2 * n; i++){int j = i + len - 1;if(check(i, j, i + 1, j - 1)) dp[i][j] += dp[i + 1][j - 1];if(check(i, i + 1, i + 2, j)) dp[i][j] += dp[i + 2][j];if(check(j - 1, j, i, j - 2)) dp[i][j] += dp[i][j - 2];}write(dp[1][2 * n]), enter;return 0;
}

51nod1522上下序列相关推荐

  1. Noip前的大抱佛脚----赛前任务

    赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...

  2. 51nod 1522 上下序列

    题目描述 现在有1到n的整数,每一种有两个.要求把他们排在一排,排成一个2*n长度的序列,排列的要求是从左到右看,先是不降,然后是不升. 特别的,也可以只由不降序列,或者不升序列构成. 例如,下面这些 ...

  3. 判断某数组是不是二叉树的前序遍历序列 python递归

    code class Solution:def VerifySquenceOfBST(self, sequence):# write code hereif len(sequence) <= 0 ...

  4. pytorch中如何处理RNN输入变长序列padding

    一.为什么RNN需要处理变长输入 假设我们有情感分析的例子,对每句话进行一个感情级别的分类,主体流程大概是下图所示: 思路比较简单,但是当我们进行batch个训练数据一起计算的时候,我们会遇到多个训练 ...

  5. PyTorch: 序列到序列模型(Seq2Seq)实现机器翻译实战

    版权声明:博客文章都是作者辛苦整理的,转载请注明出处,谢谢!http://blog.csdn.net/m0_37306360/article/details/79318644 简介 在这个项目中,我们 ...

  6. 支持向量机SVM序列最小优化算法SMO

    支持向量机(Support Vector Machine)由V.N. Vapnik,A.Y. Chervonenkis,C. Cortes 等在1964年提出.序列最小优化算法(Sequential ...

  7. LeetCode简单题之最长特殊序列 Ⅰ

    题目 给你两个字符串 a 和 b,请返回 这两个字符串中 最长的特殊序列 .如果不存在,则返回 -1 . 「最长特殊序列」 定义如下:该序列为 某字符串独有的最长子序列(即不能是其他字符串的子序列) ...

  8. GStreamer 1.0 series序列示例

    GStreamer 1.0 series序列示例 OpenEmbedded layer for GStreamer 1.0 这layer层为GStreamer 1.0框架提供了非官方的支持,用于Ope ...

  9. 微调BERT:序列级和令牌级应用程序

    微调BERT:序列级和令牌级应用程序 Fine-Tuning BERT for Sequence-Level and Token-Level Applications 为自然语言处理应用程序设计了不同 ...

最新文章

  1. Python:正则表达式re模块
  2. 笔记本电脑处理器_苹果高管:我们都没有想到M1的性能有那么强|英特尔|处理器|iphone|ipad|笔记本电脑...
  3. Asp.Net构架(Http请求处理流程) - Part.1
  4. rt linux 测试,rtlinux 的配置和测试
  5. JZOJ 100046. 【NOIP2017提高A组模拟7.14】收集卡片
  6. 【数据竞赛】Kaggle知识点:树模型特征Embedding
  7. [2018/11/13]图像处理
  8. 如何在64位Ubuntu16.04下安装java开发环境
  9. 逆向project实战--Acid burn
  10. socketio mysql_Golang + Socket.io
  11. 随笔︱MRO-Microsoft R Open使用心得与相应内容总结
  12. python网络爬虫基础知识
  13. 【分享】第48次中国互联网络发展状况统计报告- 数据截止2021年6月
  14. 【学习笔记】Arduino uno r3 控制led灯闪烁
  15. 卧槽!出了一个Python实时目标跟踪系统神器!
  16. java maven导入_Eclipse导入Maven项目详解(新手初学)
  17. 坐车看书的人都是在装逼?
  18. 花落谁家---再见熊节
  19. 常见的树以及树的应用场景
  20. C 语言的fseek()

热门文章

  1. linux创建文件默认权限umask
  2. 【航母特辑】06_乐观锁和悲观锁的业务场景以及使用案例,这篇很全
  3. try catch用于处理异常抛出,以及promis的reject状态
  4. 强强联手 传奇再续:戴尔及ALIENWARE推出全新AMD锐龙游戏本
  5. 高性能游戏本搭服务器,高性能游戏本盘点,玩游戏拒绝卡顿!
  6. dateformat系列之日期时间格式
  7. 教您快速搭建属于您自己的一对一直播平台
  8. centos7.4安装php5.6套件
  9. 12分钟充满电: 三星宣布石墨烯电池研发成功, 华为被打脸
  10. docker学习笔记(初阶)