寒假最后一补完啦 ^∀^

题意

1到n每个数字有两个,排成先不降后不升的序列,比如112332,并且满足k个形如 3 <= 6 代表第三个数字要≤第六个数字这样的约束要求,求有多少种排法。

分析

区间DP,dp[i][j]表示只有区间[i,j]还没填时的方案数。

b[i][j]表示第i和j位置的数字约束关系。

然后从两头开始排,每次把两个数字t放在两边或者同一边。

dp[i+1][j-1]+=dp[i][j];//放在两边

dp[i+2][j]+=dp[i][j];//放在左边

dp[i][j-2]+=dp[i][j];//放在右边

并且要满足约束条件。如果i位置小于j位置,那么必须先放i位置。

即放在当前位置上的数>(≥)已经放好的位置上的数,<(≤)未放置的位置上的数。

并且每次放的两个位置如果有约束关系,只能是含有=的(=、≥、≤)。

当j==i+1时,就只能一种放法了,这时候就可以累加答案了。

当我们放数字t时,区间[i,j]的长度是2*n-2*(t-1),所以j=i+2*n-2*(t-1)-1=2*n-2*t+i+1。

方案数比较大,所以要用long long。

代码

  1. #include<cstdio>
  2. #include<cstring>
  3. #define ll long long
  4. #define N 75
  5. int n,k;
  6. ll dp[N][N],ans;
  7. int b[N][N];
  8. //b[i][j] -2 -1 3 1 2
  9. //i s j > >= = <= <
  10. int ch(int fl,int fr,int a,int c)//现在排的位置上的数要比自由部分的小
  11. {
  12. for(int i=fl; i<=fr; i++)
  13. if(b[a][i]==||b[c][i]==||b[a][i]<||b[c][i]<)return ;
  14. return ;
  15. }
  16. int cc(int bl,int br,int a,int c){//现在排的位置上的数要比排好部分的大
  17. for(int i=;i<=bl;i++)
  18. if(b[a][i]>||b[c][i]>)return ;
  19. for(int i=br;i<=*n;i++)
  20. if(b[a][i]>||b[c][i]>)return ;
  21. return ;
  22. }
  23. int check(int i,int j)//不可以放在两个数字不允许相同的位置上
  24. {
  25. return b[i][j]!=-&&b[i][j]!=;
  26. }
  27. int main()
  28. {
  29. scanf("%d%d",&n,&k);
  30. for(int i=; i<=k; i++)
  31. {
  32. int l,r,f=;
  33. char s[];
  34. scanf("%d%s%d",&l,s,&r);
  35. if(s[]=='<')
  36. {
  37. f=;
  38. if(s[])f--;
  39. }
  40. else if(s[]=='>')
  41. {
  42. f=-;
  43. if(s[])f++;
  44. }
  45. b[l][r]=f;
  46. b[r][l]=f==?f:-f;
  47. }
  48. dp[][*n]=;
  49. for(int t=; t<=n; t++)
  50. for(int i=; i<=*t-; i++)
  51. {
  52. int j=*n-*t+i+;
  53. if(dp[i][j])
  54. {
  55. if(j==i+)
  56. {
  57. if(check(i,j))
  58. ans+=dp[i][j];
  59. }
  60. else
  61. {
  62. if(ch(i+,j-,i,j)&&cc(i-,j+,i,j)&&check(i,j))
  63. dp[i+][j-]+=dp[i][j];
  64. if(ch(i+,j,i,i+)&&cc(i-,j+,i,i+)&&check(i,i+))
  65. dp[i+][j]+=dp[i][j];
  66. if(ch(i,j-,j-,j)&&cc(i-,j+,j-,j)&&check(j-,j))
  67. dp[i][j-]+=dp[i][j];
  68. }
  69. }
  70. }
  71. printf("%lld",ans);
  72. return ;
  73. }

  

【CodeForces 567F】Mausoleum的更多相关文章

  1. 【codeforces 415D】Mashmokh and ACM(普通dp)

    [codeforces 415D]Mashmokh and ACM 题意:美丽数列定义:对于数列中的每一个i都满足:arr[i+1]%arr[i]==0 输入n,k(1<=n,k<=200 ...

  2. 【codeforces 707E】Garlands

    [题目链接]:http://codeforces.com/contest/707/problem/E [题意] 给你一个n*m的方阵; 里面有k个联通块; 这k个联通块,每个连通块里面都是灯; 给你q ...

  3. 【codeforces 707C】Pythagorean Triples

    [题目链接]:http://codeforces.com/contest/707/problem/C [题意] 给你一个数字n; 问你这个数字是不是某个三角形的一条边; 如果是让你输出另外两条边的大小 ...

  4. 【codeforces 709D】Recover the String

    [题目链接]:http://codeforces.com/problemset/problem/709/D [题意] 给你一个序列; 给出01子列和10子列和00子列以及11子列的个数; 然后让你输出 ...

  5. 【codeforces 709B】Checkpoints

    [题目链接]:http://codeforces.com/contest/709/problem/B [题意] 让你从起点开始走过n-1个点(至少n-1个) 问你最少走多远; [题解] 肯定不多走啊; ...

  6. 【codeforces 709C】Letters Cyclic Shift

    [题目链接]:http://codeforces.com/contest/709/problem/C [题意] 让你改变一个字符串的子集(连续的一段); ->这一段的每个字符的字母都变成之前的一 ...

  7. 【Codeforces 429D】 Tricky Function

    [题目链接] http://codeforces.com/problemset/problem/429/D [算法] 令Si = A1 + A2 + ... + Ai(A的前缀和) 则g(i,j) = ...

  8. 【Codeforces 670C】 Cinema

    [题目链接] http://codeforces.com/contest/670/problem/C [算法] 离散化 [代码] #include<bits/stdc++.h> using ...

  9. 【codeforces 515D】Drazil and Tiles

    [题目链接]:http://codeforces.com/contest/515/problem/D [题意] 给你一个n*m的格子; 然后让你用1*2的长方形去填格子的空缺; 如果有填满的方案且方案 ...

随机推荐

  1. Android开发环境搭建(转)

    转载:http://www.cnblogs.com/zoupeiyang/p/4034517.html#1 引言   在windows安装Android的开发环境不简单也说不上算复杂,本文写给第一次想 ...

  2. JavaScript测试工具

    大家都知道Javascript的测试比较麻烦,一般是开发使用一些浏览器的插件比如IE develop bar或是firebug来调试,而测试往往需要通过页面展示后的js错误提示来定位.那么还有其他比较 ...

  3. 使用 ssh 连接github的方法说明(gitub的官方说法)

    https://help.github.com/articles/generating-an-ssh-key/

  4. iOS9 判断微信qq是否安装

    iOS 9检测QQ.微信是否安装无效的解决方法 在info.plist里面添加LSApplicationQueriesSchemes(Array类型),然后插入weixin, wechat, mqq的 ...

  5. relative 和 absolute

    relative总是相对于其最近的父层 absolute总是相对于其最近的定义为relative或absolute的父层

  6. 解析 HTTP(HttpURLConnection getResponseCode)

    HTTP 请求 客户端通过发送 HTTP 请求向服务器请求对资源的访问.HTTP 请求由三部分组成,分别是:请求行.消息报头和请求征文. 3.1.请求行 请求行以一个方法符号开头,后面跟着请求 URI ...

  7. [资料]PHP Yaf

    QConShanghai2013-惠新宸-微博LAMP性能优化之路 Yaf-一个PHP扩展实现的PHP框架 Baidu Yaf

  8. C语言 函数理解(以数组做参数)

    #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> int run(int *p){ // ...

  9. C语言 复杂的栈(链表栈)

    //复杂的栈--链表栈 #include<stdio.h> #include<stdlib.h> #define datatype int//定义链表栈数据类型 //定义链表栈 ...

  10. Ubuntu Navicat for MySQL安装以及破解方案

    今天发现Navicat for MySQL有LINUX版本了哈, 开心的说,首先上官网上下载LINUX版本: http://www.navicat.com/download 1. 下载 navicat ...