51NOD1522 上下序列/CF567F Mausoleum DP
考虑状态$f_{p,q}$表示左边已经填了$p$个,右边填了$q$个的方案(其实可以压掉其中一维),考虑第$i$个数字的转移,有$3$种:
$a:$将这两个$i$都放在序列最左边;$b:$将这两个$i$放在序列最右边;$c.$将这两个$i$一个放一边。
对于$K$个约束条件我们可以在加入的时候直接判断:当前加入的两个数相等,没加入的位置的数必定比当前加的数大,而其他已经填好的地方一定比当前的数小。
最后的答案是$\frac{\sum\limits_{i=0}^{2n}f_{i,2n-i}}{3}$,除3是因为对于最后一次加入,$abc$三种方案都是可行的,但是我们只能算一种。
注意判断约束条件时的细节,约束条件的存储可以使用类似邻接表的方法,在加入约束条件时如加入无向边一样变成两个约束条件,判断起来会方便一些。
#include<bits/stdc++.h> #define int long long using namespace std; ][] , numOp[]; vector < ] , op[]; map < string , int > opToNum; bool ifOK(int l , int r , int que1 , int que2){ //特别注意判断que1位置与que2位置有联系的情况 ; i < numOp[que1] ; i++) switch(op[que1][i]){ : if(num[que1][i] < r && num[que1][i] > l || num[que1][i] == que2) ; break; : if(num[que1][i] < r && num[que1][i] > l && num[que1][i] != que2) ; break; : if(!(num[que1][i] == que2)) ; break; : if(!(num[que1][i] <= r && num[que1][i] >= l || num[que1][i] == que2)) ; break; : if(!(num[que1][i] < r && num[que1][i] > l) || num[que1][i] == que2) ; } ; i < numOp[que2] ; i++) switch(op[que2][i]){ : if(num[que2][i] < r && num[que2][i] > l || num[que2][i] == que1) ; break; : if(num[que2][i] < r && num[que2][i] > l && num[que2][i] != que1) ; break; : if(!(num[que2][i] == que1)) ; break; : if(!(num[que2][i] <= r && num[que2][i] >= l || num[que2][i] == que1)) ; break; : if(!(num[que2][i] < r && num[que2][i] > l) || num[que2][i] == que1) ; } ; } main(){ opToNum.insert(make_pair()); opToNum.insert(make_pair()); opToNum.insert(make_pair()); opToNum.insert(make_pair()); opToNum.insert(make_pair()); int N , K; for(cin >> N >> K ; K ; K--){ int a , b , t; string s; cin >> a >> s >> b; t = opToNum.find(s)->second; if(a == b) || t == ){ cout << ; ; } else continue; num[a].push_back(b); op[a].push_back(t); num[b].push_back(a); op[b].push_back( - t); numOp[a]++; numOp[b]++; } ans[][] = ; ; i <= N ; i++){ //DP * i ; j >= ; j--) ][ * i - j] && ifOK(j , * N - * i + j + , j , j - )) ans[j][ * i - j] += ans[j - ][ * i - j]; * i ; j >= ; j--) * i - j][j - ] && ifOK( * i - j , * N - j + , * N - j + , * N - j + )) ans[ * i - j][j] += ans[ * i - j][j - ]; ; j < * i ; j++) * i - j - ][j - ] && ifOK( * i - j , * N - j + , * i - j , * N - j + )) ans[ * i - j][j] += ans[ * i - j - ][j - ]; } ; ; i <= * N ; i++) all += ans[i][ * N - i]; cout << all / ; ; }
51NOD1522 上下序列/CF567F Mausoleum DP的更多相关文章
- 括号序列(区间dp)
括号序列(区间dp) 输入一个长度不超过100的,由"(",")","[",")"组成的序列,请添加尽量少的括号,得到一 ...
- 区间和序列上的dp
区间上的dp状态设计最基本的形式: \(F[i]\)表示以i结尾的最优值或方案数. \(F[i][k]\)表示以i结尾附加信息为k的最优值或方案数. 当然可以有多维附加信息. 转移的话往往是枚举上一个 ...
- bzoj4032/luoguP4112 [HEOI2015]最短不公共子串(后缀自动机+序列自动机上dp)
bzoj4032/luoguP4112 [HEOI2015]最短不公共子串(后缀自动机+序列自动机上dp) bzoj Luogu 题解时间 给两个小写字母串 $ A $ , $ B $ ,请你计算: ...
- LGTB与序列 状压dp
考试一看我就想到了状压dp.当时没有想到素数,以为每一位只有0~9这些数,就开始压了.后来发现是小于30,然后改到了15,发现数据一点不给面子,一个小点得数都没有,完美爆零.. 考虑到bi最多变成58 ...
- 「长乐集训 2017 Day10」划分序列 (二分 dp)
「长乐集训 2017 Day10」划分序列 题目描述 给定一个长度为 n nn 的序列 Ai A_iAi,现在要求把这个序列分成恰好 K KK 段,(每一段是一个连续子序列,且每个元素恰好属于一 ...
- 【Foreign】划分序列 [线段树][DP]
划分序列 Time Limit: 20 Sec Memory Limit: 256 MB Description Input Output 仅一行一个整数表示答案. Sample Input 9 4 ...
- 九度OJ 1077:最大序列和 (DP)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:5600 解决:1637 题目描述: 给出一个整数序列S,其中有N个数,定义其中一个非空连续子序列T中所有数的和为T的"序列和&qu ...
- 算法复习——求最长不下降序列长度(dp算法)
题目: 题目背景 161114-练习-DAY1-AHSDFZ T2 题目描述 有 N 辆列车,标记为 1,2,3,…,N.它们按照一定的次序进站,站台共有 K 个轨道,轨道遵从先进先出的原则.列车进入 ...
- hdu 4521 小明系列问题——小明序列(线段树+DP或扩展成经典的LIS)
小明系列问题--小明序列 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Tot ...
随机推荐
- Nginx 反向代理工作原理简介与配置详解
Nginx反向代理工作原理简介与配置详解 by:授客 QQ:1033553122 测试环境 CentOS 6.5-x86_64 nginx-1.10.0 下载地址:http://nginx. ...
- Yarn 安装 on centos7
本文演示如何在CentOS7上安装Yarn.注意这个Yarn是Js包管理器,不是Hadoop的资源调度器. 1 准备工作 1.1 浏览器访问安装包下载地址: https://github.com/ya ...
- 慕学在线网0.4_xadmin后台管理
admin是基于Django开发的后台管理框架,方便,快捷,而且简单: 而xadmin就相当于admin的升级版,更加强大. 1.安装xadmin(源码安装方式) 教程 PS: - 卸载pip安装的x ...
- RabbitMQ延迟消息学习
准备做一个禁言自动解除的功能,立马想到了订单的超时自动解除,刚好最近在看RabbitMQ的实现,于是想用它实现,查询了相关文档发现确实可以实现,动手编写了这篇短文. 准备工作 1.Erlang安装请参 ...
- Scrapy爬虫入门
1.安装Scrapy 打开Anaconda Prompt,执行:pip install Scrapy执行安装! 注意:要是安装过程中抛出: error: Microsoft Visual C++ 14 ...
- NoSQL&Redis
1.介绍NoSQL NoSQL(Not Only SQL):不仅仅是SQL,是一项全新的数据库理念,泛指非关系型数据库,原来我们所使用的MySQL.Oracle.Microsoft SQL Serve ...
- Java获取数据库表 字段 存储的部分数据
在浏览器页面,选中图片(可多选) >单击删除按钮. 重点是, 本数据库表TabHeBeiTianQi中 存在 同一id,对应的picLocalPath字段 存储了多张图片,图片地址用 逗号 ...
- Python基础知识:测试代码
1.Python标准库中的模块unittest提供了代码测试工具. 单元测试用于核实函数的某个方面没有问题: 测试用例是一组单元测试,这些单元测试一起核实函数在各种情形下的行为都符合要求. 通俗的理解 ...
- Python-数学篇之计算方法的目录:
目录: 1.出本专题的初衷: 2.参考计算方法的书籍: 3.具体算法的实现: (一)出本专题的初衷: 在我们机械专业的大二上学期课程中,能与计算机沾上边的科目就数<计算方法>了.简化为&q ...
- MySQL基本简单操作03
MySQL基本简单操作 现在我创建了一个数据表,表的内容如下: mysql> select * from gubeiqing_table; +----------+-----+ | name | ...