Sit sit sit

问题描述
  1. 在一个XX大学中有NN张椅子排成一排,椅子上都没有人,每张椅子都有颜色,分别为蓝色或者红色。 接下来依次来了NN个学生,标号依次为1,2,3,...,N 对于每个学生,他会找一张还没有人坐的椅子坐下来。但是如果这张椅子满足以下三个条件他就不会去坐。
  2. 1. 这张椅子左右两边都有相邻的椅子
  3. 2. 这张椅子左右两边相邻的椅子都不是空的,也就是有人坐下了
  4. 3. 这张椅子左右两边相邻的椅子的颜色不同
  5. 如果当前的学生找不到椅子坐下,那他就会走掉。
  6. 对于当前的某个学生,他可能有很多种椅子的选择来坐。你的任务是计算有多少种不同的全部的学生都坐下来的情况。结果可能很大,输出答案对1000000007({10}^{9}+7)1000000007(109​​+7) 取模。
输入说明
  1. 输入有多组测试数据。
  2. 对于每组测试数据:
  3. 第一行为一个整数 N(1\leq N\leq 100)N(1N100),第二行为 NN个整数表示椅子的颜色,数的范围为010代表蓝色,1代表红色。
输出说明
  1. 对于每组测试数据,输出答案对1000000007({10}^{9}+7)1000000007(109​​+7)取模。
输入样例
  1. 3
  2. 1 0 0
  3. 4
  4. 1 0 0 1
输出样例
  1. 4
  2. 8

 题解:   区间DP+组合计数问题,转移方程为,每次选当前区间最后一个放的位置,然后乘上组合数C[区间长度][左区间长度]

注意dp 数组的初始化 -1

  1. //meek///#include<bits/stdc++.h>
  2. #include <cstdio>
  3. #include <cmath>
  4. #include <cstring>
  5. #include <algorithm>
  6. #include<iostream>
  7. #include<bitset>
  8. using namespace std ;
  9. #define mem(a) memset(a,0,sizeof(a))
  10. #define pb push_back
  11. #define fi first
  12. #define se second
  13. #define MP make_pair
  14. typedef long long ll;
  15.  
  16. const int N = ;
  17. const int M = ;
  18. const int inf = 0x3f3f3f3f;
  19. const int MOD = ;
  20. const double eps = 0.000001;
  21.  
  22. int dp[N][N],a[N],n,c[N+][N+];
  23. int dfs(int l,int r) {
  24. if(dp[l][r]!=- ) return dp[l][r];
  25. if(l > r) return ;
  26. int& ret = dp[l][r] = ;
  27. if(l == r) {
  28. if(l == ||r == n||a[l-] == a[r+]) return ret = ;
  29. else return ret = ;
  30. }
  31. for(int i=l;i<=r;i++) {
  32. ret += 1ll*dfs(l,i-)*dfs(i+,r)%MOD*c[r-l][i-l]%MOD;
  33. ret %= MOD;
  34. }
  35. return ret;
  36. }
  37. void init() {
  38. for(int i=;i<=;i++) {
  39. c[i][] = ;
  40. for(int j=;j<=i;j++) {
  41. c[i][j] = (c[i-][j] + c[i-][j-])%MOD;
  42. }
  43. }
  44. }
  45. int main() {
  46. init();
  47. while(scanf("%d",&n)!=-) {
  48. memset(dp,-,sizeof(dp));
  49. for(int i=;i<=n;i++) scanf("%d",&a[i]);
  50. printf("%d\n",dfs(,n));
  51. }
  52. return ;
  53. }

代码

HDU 5151 Sit sit sit 区间DP + 排列组合的更多相关文章

  1. hdu5396 Expression 区间dp +排列组合

    #include<stdio.h> #include<string> #include<map> #include<vector> #include&l ...

  2. 【BZOJ】2111: [ZJOI2010]Perm 排列计数 计数DP+排列组合+lucas

    [题目]BZOJ 2111 [题意]求有多少1~n的排列,满足\(A_i>A_{\frac{i}{2}}\),输出对p取模的结果.\(n \leq 10^6,p \leq 10^9\),p是素数 ...

  3. 【BZOJ】4559: [JLoi2016]成绩比较 计数DP+排列组合+拉格朗日插值

    [题意]n位同学(其中一位是B神),m门必修课,每门必修课的分数是[1,Ui].B神碾压了k位同学(所有课分数<=B神),且第x门课有rx-1位同学的分数高于B神,求满足条件的分数情况数.当有一 ...

  4. G.subsequence 1(dp + 排列组合)

    subsequence 1 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO Format: %lld 题目描述 You are ...

  5. hdu 4597 + uva 10891(一类区间dp)

    题目链接:http://vjudge.net/problem/viewProblem.action?id=19461 思路:一类经典的博弈类区间dp,我们令dp[l][r]表示玩家A从区间[l, r] ...

  6. HDU 2476 String painter (区间DP)

    题意:给出两个串a和b,一次只能将一个区间刷一次,问最少几次能让a=b 思路:首先考虑最坏的情况,就是先将一个空白字符串刷成b需要的次数,直接区间DP[i][j]表示i到j的最小次数. 再考虑把a变成 ...

  7. HDU 4597 Play Game(区间DP(记忆化搜索))

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4597 题目大意: 有两行卡片,每个卡片都有各自的权值. 两个人轮流取卡片,每次只能从任一行的左端或右端 ...

  8. hdu 5115 Dire Wolf(区间dp)

    Problem Description Dire wolves, also known as Dark wolves, are extraordinarily large and powerful w ...

  9. HDU 2476 String painter(区间DP)

    String painter Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...

随机推荐

  1. JavaScript高级程序设计之JSON

    IE8以下请求助神之Douglas Crockford:https://github.com/douglascrockford/json-js JSON是一种格式化的字符串,特别适合在网络上传输,由D ...

  2. Node.js深受欢迎的六大原因

    Node.js是一种后起的优秀服务器编程语言,它用来构建和运行Web应用,这和ASP.NET,Ruby on Rails或Spring框架做的工作是类似的.它使用JavaScript作为主要的开发语言 ...

  3. 2015年iOS测试现状

    本文由 伯乐在线 - nathanw 翻译,dopcn 校稿.未经许可,禁止转载! 英文出处:www.mokacoding.com.欢迎加入翻译小组. 几周前,我决定将将我在 mokacoding 上 ...

  4. Mono for Android (3)-- AbsoluteLayout、FrameLayout、LinearLayout、RelativeLayout、TableLayout

    AbsoluteLayout:允许开发人员将视图放在所定义的位置.该布局已经过时了,建议改用其他 FrameLayout:最简单的布局选项,其设计目的是在屏幕上显示单个对象.所有元素都固定在左上角.如 ...

  5. OC学习笔记之属性详解和易错点

    属性的概念在OC1.0中就存在,格式是定义实例变量,然后定义setter和getter方法,用点操作符操作属性 举例,类的接口部分 @interface Father : NSObject { NSI ...

  6. pietty and putty safe password

    如何让putty记住密码..pietty也一样的不能记住密码. 找不到好的的方法...只好试着按照参数格式做了一个快捷方式..F:\soft\pietty.exe -pw password123 ro ...

  7. 事后分析报告(M1阶段)

    我们的项目是自选项目,一款名为备忘录锁屏MemoryDebris的软件. 因为我们组成员在此之前都没有接触过安卓开发,于是在第一阶段花了很大的时间和精力学习安卓.又花费了较长一段时间设计软件与研究安卓 ...

  8. SQL SERVER中查询无主键的SQL

    --生成表 IF  EXISTS ( SELECT  name                FROM    sysobjects                WHERE   xtype = 'u' ...

  9. hibernate tool连接oracle生成pojo和xml文件无法查询表解决办法

    需要在hibernate的配置文件中增加 <property name="hibernate.default_schema">[username]</proper ...

  10. android开发,socket发送文件,read阻塞,得不到文件尾-1

    这是我的接收文件代码:开始可以读取到-1,但是现在又读取不到了,所以才加上红色字解决的(注释的代码) File file = new File(mfilePath,"chetou." ...