HDU 5151 Sit sit sit 区间DP + 排列组合
Sit sit sit
在一个XX大学中有NN张椅子排成一排,椅子上都没有人,每张椅子都有颜色,分别为蓝色或者红色。 接下来依次来了NN个学生,标号依次为1,2,3,...,N。 对于每个学生,他会找一张还没有人坐的椅子坐下来。但是如果这张椅子满足以下三个条件他就不会去坐。 1. 这张椅子左右两边都有相邻的椅子 2. 这张椅子左右两边相邻的椅子都不是空的,也就是有人坐下了 3. 这张椅子左右两边相邻的椅子的颜色不同 如果当前的学生找不到椅子坐下,那他就会走掉。 对于当前的某个学生,他可能有很多种椅子的选择来坐。你的任务是计算有多少种不同的全部的学生都坐下来的情况。结果可能很大,输出答案对1000000007({10}^{9}+7)1000000007(109+7) 取模。
输入有多组测试数据。 对于每组测试数据: 第一行为一个整数 N(1\leq N\leq 100)N(1≤N≤100),第二行为 NN个整数表示椅子的颜色,数的范围为0到1,0代表蓝色,1代表红色。
对于每组测试数据,输出答案对1000000007({10}^{9}+7)1000000007(109+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 + 排列组合相关推荐
- hdu 5151 Sit sit sit(区间dp+排列组合)
题目链接:hdu 5151 Sit sit sit 题意: 一共有并排N个椅子, N个学生依次去坐,同时满足3个条件就不能坐下去: 1,该椅子不在最左,不在最右. 2,该椅子左右都有人坐了. 3,左右 ...
- HDU 2476 String painter (区间DP)
题意:给出两个串a和b,一次只能将一个区间刷一次,问最少几次能让a=b 思路:首先考虑最坏的情况,就是先将一个空白字符串刷成b需要的次数,直接区间DP[i][j]表示i到j的最小次数. 再考虑把a变成 ...
- hdu 4597 + uva 10891(一类区间dp)
题目链接:http://vjudge.net/problem/viewProblem.action?id=19461 思路:一类经典的博弈类区间dp,我们令dp[l][r]表示玩家A从区间[l, r] ...
- HDU 5115 Dire Wolf ——(区间DP)
比赛的时候以为很难,其实就是一个区间DP= =..思路见:点我. 区间DP一定要记住先枚举区间长度啊= =~!因为区间dp都是由短的区间更新长的区间的,所以先把短的区间更新完.. 代码如下: 1 #i ...
- bzoj 3398 [Usaco2009 Feb]Bullcow 牡牛和牝牛——前缀和优化dp / 排列组合
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3398 好简单呀.而且是自己想出来的. dp[ i ]表示最后一个牡牛在 i 的方案数. 当前 ...
- hdu 5155(DP+排列组合)
问题描述 一个盒子由n*m个格子组成,有一些格子里会有闪闪发光的宝石. 现在有求盒子从左边看过去,每一行都闪烁着光芒,从前面看过去,每一列也都闪烁着光芒. 问:盒子里的宝石有多少种分布情况. 答案有可 ...
- hdu 5151 Sit sit sit(区间dp)
题意: 给出一排座位现在要让所有学生入座,每个座位都有颜色,0表示蓝色,1表示红色,但是如果同时满足以下条件学生就不会坐下这个位置: 1.座位的左右都有座位 2.座位的左右都有人坐下了 3.座位的左右 ...
- Sit sit sit HDU - 5151 (区间dp +组合计数)
这道这道区间DP,我也开始觉得其实区间DP是一种应用型的思想,做这类题目一个重要的点是在于题目情景的把握,这道题的一个情景就是数学的排列组合问题. 首先应用根据小区间推出大区间的思路,我们可以先固定一 ...
- hdu_5151_Sit sit sit(区间DP)
传送门 题意:有n张椅子,n个人,所有人都可以按照任意顺序坐在任意一张椅子上,但是满足这三种情况的椅子不会有人坐: 1.椅子上有左右两张相邻的椅子. 2.左右相邻的椅子不是空的. 3.左右相邻的椅子颜 ...
最新文章
- java多线程--死锁
- 教你从0到1搭建秒杀系统-Canal快速入门(番外篇)
- PyQt5利用QPainter绘制各种图形
- 六十六、Leetcode数组系列(中篇)
- mysql 基础配置经验
- Java 对象初始化过程
- R中千分位分隔符数值(美式数值)读取
- MySQL5.6二进制软件包编译安装详解(三)
- windows2003 iis 配置 php
- 精选了20个Python实战项目(附源码),拿走就用!
- 软考网络工程师教程第五版(2018年最新版)
- 2019FME博客大赛——基于FME的武汉市航班数据获取及城市联系度分析
- vm安装win7系统
- LabWindows操作Excel
- 51单片机控制双步进电机的魔法师思想
- 12 最长考拉兹序列
- 统信uos设置静态IP
- 反正切函数摘录自变频器
- 看不懂简明python教程_简明python教程的读书笔记(一)
- vue打包时页面布局出现混乱