大致题意:你有$1$到$N$的所有正整数每个数两个,现在需要你将它排成一个序列,使得序列为单峰序列(存在一个$j \in [1,2N]$满足$a_1 \leq a_2 \leq .. \leq a_j \geq a_{j+1} ... \geq a_{2N}$),并且满足输入中给出的$K$个约束条件。$N \leq 35 , K \leq 100$

因为序列要满足单峰,所以考虑从小到大在没有加入数字的序列位置的最左和最右加入元素,这样序列将会一直满足单峰性质
考虑状态$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的更多相关文章

  1. 括号序列(区间dp)

    括号序列(区间dp) 输入一个长度不超过100的,由"(",")","[",")"组成的序列,请添加尽量少的括号,得到一 ...

  2. 区间和序列上的dp

    区间上的dp状态设计最基本的形式: \(F[i]\)表示以i结尾的最优值或方案数. \(F[i][k]\)表示以i结尾附加信息为k的最优值或方案数. 当然可以有多维附加信息. 转移的话往往是枚举上一个 ...

  3. bzoj4032/luoguP4112 [HEOI2015]最短不公共子串(后缀自动机+序列自动机上dp)

    bzoj4032/luoguP4112 [HEOI2015]最短不公共子串(后缀自动机+序列自动机上dp) bzoj Luogu 题解时间 给两个小写字母串 $ A $ , $ B $ ,请你计算: ...

  4. LGTB与序列 状压dp

    考试一看我就想到了状压dp.当时没有想到素数,以为每一位只有0~9这些数,就开始压了.后来发现是小于30,然后改到了15,发现数据一点不给面子,一个小点得数都没有,完美爆零.. 考虑到bi最多变成58 ...

  5. 「长乐集训 2017 Day10」划分序列 (二分 dp)

    「长乐集训 2017 Day10」划分序列 题目描述 给定一个长度为 n nn 的序列 Ai A_iA​i​​,现在要求把这个序列分成恰好 K KK 段,(每一段是一个连续子序列,且每个元素恰好属于一 ...

  6. 【Foreign】划分序列 [线段树][DP]

    划分序列 Time Limit: 20 Sec  Memory Limit: 256 MB Description Input Output 仅一行一个整数表示答案. Sample Input 9 4 ...

  7. 九度OJ 1077:最大序列和 (DP)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:5600 解决:1637 题目描述: 给出一个整数序列S,其中有N个数,定义其中一个非空连续子序列T中所有数的和为T的"序列和&qu ...

  8. 算法复习——求最长不下降序列长度(dp算法)

    题目: 题目背景 161114-练习-DAY1-AHSDFZ T2 题目描述 有 N 辆列车,标记为 1,2,3,…,N.它们按照一定的次序进站,站台共有 K 个轨道,轨道遵从先进先出的原则.列车进入 ...

  9. hdu 4521 小明系列问题——小明序列(线段树+DP或扩展成经典的LIS)

    小明系列问题--小明序列 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Tot ...

随机推荐

  1. 快捷键整理(来源:http://www.cnblogs.com/xing901022/p/4741630.htm)

    Eclipse 跳转到指定行:ctrl+l 1几个最重要的快捷键 代码助手:Ctrl+Space(简体中文操作系统是Alt+/)快速修正:Ctrl+1单词补全:Alt+/打开外部Java文档:Shif ...

  2. 慕学在线网0.3_四个model

    1.四个model完整代码: # users/models.py from datetime import datetime from django.db import models from dja ...

  3. 【CSS基础】实现 div 里的内容垂直水平居中

    方案一: 所有内容垂直水平居中 兼容性:IE8+. 条件:内容宽度和高度可以未知,可以是多行文字.图片.div. 描述:使用table-cell + vertical-align , html代码见文 ...

  4. [20171223]grid用户的环境变量问题.txt

    [20171223]grid用户的环境变量问题.txt --//oracle 11G 安装RAC,一般需要建立grid用户,使用这个用户管理asm,群集信息.--//在安装过程中,同事的疑问实际上也是 ...

  5. windows server服务器上mysql远程连接失败的坑

    windows server服务器上mysql远程连接失败的坑 背景:趁这阿里云活动,和朋友合伙买了个服务器,最坑的是没想到他买的是windows Server的,反正便宜,将就着用吧,自己装好了wa ...

  6. Windows 下配置 Apache 支持 https

    1.打开cmd ,输入  F: // 切换到Apache安装路径,我的Apache安装目录在 F盘 2.cd F:\Apache\bin 3.set "openssl_conf = F:\A ...

  7. Mac快速上手指南

    上周刚入手了2017版MacBookPro,预装macOS High Sierra.第一次接触Mac系统,经过一周的使用,简单总结下与Windows相比最常用的功能,快速上手. 1.Mac键盘实现Ho ...

  8. input 属性radio中设置checked 不生效

    同一个页面中有许多地方都用到了单选按钮并设置了默认选中 , 结果在运行的时候发现单选按钮没有被默认选中 由于是复制然后修改个别属性 ,然后直接使用的 , 所以name值忘记修改了 , 单选框是根据na ...

  9. creo5.0安装教程(图文详解)

    PTC公司最近发布了Creo 5.0正式版 ,作为最具其革命性的新一代产品设计软件,其所提供专业的二维和三维设计设计,能帮助企业和公司进行产品生命周期管理(PLM)和制定服务管理解决方案.Creo5. ...

  10. 阿里八八β阶段Scrum(1/5)

    今日进度 叶文滔: 修改了α阶段遗留的部分界面BUG,比如状态栏白底等 张岳: 修复用户模块信息修改返回失败的BUG 林炜鸿: 重构了添加事件的代码,增加可修改的特性 黄梅玲: 绘制了新的日程显示格界 ...