Sit sit sit

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

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

注意dp 数组的初始化 -1

//meek///#include<bits/stdc++.h>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include<iostream>
#include<bitset>
using namespace std ;
#define mem(a) memset(a,0,sizeof(a))
#define pb push_back
#define fi first
#define se second
#define MP make_pair
typedef long long ll;const int N = 110;
const int M = 1000001;
const int inf = 0x3f3f3f3f;
const int MOD = 1000000007;
const double eps = 0.000001;int dp[N][N],a[N],n,c[N+5][N+5];
int dfs(int l,int r) {if(dp[l][r]!=-1 ) return dp[l][r];if(l > r) return 1;int& ret = dp[l][r] = 0;if(l == r) {if(l == 1||r == n||a[l-1] == a[r+1]) return ret = 1;else return ret = 0;}for(int i=l;i<=r;i++) {ret += 1ll*dfs(l,i-1)*dfs(i+1,r)%MOD*c[r-l][i-l]%MOD;ret %= MOD;}return ret;
}
void init() {for(int i=0;i<=100;i++) {c[i][0] = 1;for(int j=1;j<=i;j++) {c[i][j] = (c[i-1][j] + c[i-1][j-1])%MOD;}}
}
int main() {init();while(scanf("%d",&n)!=-1) {memset(dp,-1,sizeof(dp));for(int i=1;i<=n;i++) scanf("%d",&a[i]);printf("%d\n",dfs(1,n));}return 0;
}

代码

转载于:https://www.cnblogs.com/zxhl/p/5076276.html

HDU 5151 Sit sit sit 区间DP + 排列组合相关推荐

  1. hdu 5151 Sit sit sit(区间dp+排列组合)

    题目链接:hdu 5151 Sit sit sit 题意: 一共有并排N个椅子, N个学生依次去坐,同时满足3个条件就不能坐下去: 1,该椅子不在最左,不在最右. 2,该椅子左右都有人坐了. 3,左右 ...

  2. HDU 2476 String painter (区间DP)

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

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

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

  4. HDU 5115 Dire Wolf ——(区间DP)

    比赛的时候以为很难,其实就是一个区间DP= =..思路见:点我. 区间DP一定要记住先枚举区间长度啊= =~!因为区间dp都是由短的区间更新长的区间的,所以先把短的区间更新完.. 代码如下: 1 #i ...

  5. bzoj 3398 [Usaco2009 Feb]Bullcow 牡牛和牝牛——前缀和优化dp / 排列组合

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3398 好简单呀.而且是自己想出来的. dp[ i ]表示最后一个牡牛在 i 的方案数. 当前 ...

  6. hdu 5155(DP+排列组合)

    问题描述 一个盒子由n*m个格子组成,有一些格子里会有闪闪发光的宝石. 现在有求盒子从左边看过去,每一行都闪烁着光芒,从前面看过去,每一列也都闪烁着光芒. 问:盒子里的宝石有多少种分布情况. 答案有可 ...

  7. hdu 5151 Sit sit sit(区间dp)

    题意: 给出一排座位现在要让所有学生入座,每个座位都有颜色,0表示蓝色,1表示红色,但是如果同时满足以下条件学生就不会坐下这个位置: 1.座位的左右都有座位 2.座位的左右都有人坐下了 3.座位的左右 ...

  8. Sit sit sit HDU - 5151 (区间dp +组合计数)

    这道这道区间DP,我也开始觉得其实区间DP是一种应用型的思想,做这类题目一个重要的点是在于题目情景的把握,这道题的一个情景就是数学的排列组合问题. 首先应用根据小区间推出大区间的思路,我们可以先固定一 ...

  9. hdu_5151_Sit sit sit(区间DP)

    传送门 题意:有n张椅子,n个人,所有人都可以按照任意顺序坐在任意一张椅子上,但是满足这三种情况的椅子不会有人坐: 1.椅子上有左右两张相邻的椅子. 2.左右相邻的椅子不是空的. 3.左右相邻的椅子颜 ...

最新文章

  1. java多线程--死锁
  2. 教你从0到1搭建秒杀系统-Canal快速入门(番外篇)
  3. PyQt5利用QPainter绘制各种图形
  4. 六十六、Leetcode数组系列(中篇)
  5. mysql 基础配置经验
  6. Java 对象初始化过程
  7. R中千分位分隔符数值(美式数值)读取
  8. MySQL5.6二进制软件包编译安装详解(三)
  9. windows2003 iis 配置 php
  10. 精选了20个Python实战项目(附源码),拿走就用!
  11. 软考网络工程师教程第五版(2018年最新版)
  12. 2019FME博客大赛——基于FME的武汉市航班数据获取及城市联系度分析
  13. vm安装win7系统
  14. LabWindows操作Excel
  15. 51单片机控制双步进电机的魔法师思想
  16. 12 最长考拉兹序列
  17. 统信uos设置静态IP
  18. 反正切函数摘录自变频器
  19. 看不懂简明python教程_简明python教程的读书笔记(一)
  20. vue打包时页面布局出现混乱

热门文章

  1. 如何在 UE4 中设置光线追踪功能
  2. 两连续型随机变量得到复合随机变量的分布函数及密度函数
  3. 硅谷想挑战非洲市场?非洲并不适合胆小鬼
  4. 理解COM套间(第一部分)
  5. GLONASS天线市场深度研究分析报告
  6. python 计算两圆的公切线
  7. 编程的思想性——议编程与“武功”的一致性
  8. 用unity简单做了个七七桌宠
  9. 使用 GraphQL 无限滚动
  10. 数据安全学习交流活动之走进360