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 ...
随机推荐
- 世界地图和主要国家的 JSON 文件
转自:http://blog.csdn.net/chinagissoft/article/details/52136253 世界地图: world.json 美洲: 美国:USA.json 加拿大:C ...
- WebAPI路由、参数绑定
一.测试Web API a)测试Web API可以用来检测请求和返回数据是否正常,可以使用Fiddler.Postman等工具.以Fiddler为例,这是一个http协议调试代理工具,它能够记录客 ...
- 《Inside C#》笔记(五) 方法
方法用来体现类的行为. 一 相关概念 a) ref和out 通常一个方法只能返回一个值,但如果确实需要返回多个值时,可以使用ref或out.如果方法的参数被标注为ref或out,在调用该方法时,会传递 ...
- SDK Manager
dx.bat :将所有的.class文件变成一个.dex文件. aapt:Android Application package tools 安卓应用的打包工具. adb:Android Debug ...
- linux上用newman+postman进行自动化测试
第一步:导出postman文件 Postman就是根据collection和enviroment这两个json文件来自动化运行的! 所以从Postman中导出collection和enviroment ...
- CSS中各种长度单位总结
在前端开发工作过程中曾碰到这样一问题: <style type="text/css"> .parent{ width:400px; height:300px; bord ...
- [20170927]关于hugepages.txt
[20170927]关于hugepages.txt --//今天测试hugepages与内核参数nr_overcommit_hugepages,才发现HugePages_Surp表示什么? --// ...
- 洗礼灵魂,修炼python(9)--灵性的字符串
python几大核心之——字符串 1.什么是字符串 其实前面说到数据类型时说过了,就是带有引号的参数,“”引号内的一切东西就是字符串,字符串又叫文本. 2.创建字符串的两种方式: 3.字符串的方法: ...
- python第十二天 生成器,迭代器,内置函数
第二模块学习: 生成器,迭代器,内置函数 生成器特点:只有在调用时才会生成相应的数据,运行的速度快! 示例: def fil(max):#斐波那契数 n,a,b=0,0,1 #定义初始数据 whil ...
- ubuntu 配置拼音输入法步骤
今天配置了一下 ubuntu 拼音,要求使用ubuntu 内置拼音.大致步骤我记录一下: 配置拼音,使用 ibus pinyin,网上有很多帖子大致步骤: 1)安装 中文语言 2)安装ibus 3) ...