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 = ;
const int M = ;
const int inf = 0x3f3f3f3f;
const int MOD = ;
const double eps = 0.000001; int dp[N][N],a[N],n,c[N+][N+];
int dfs(int l,int r) {
if(dp[l][r]!=- ) return dp[l][r];
if(l > r) return ;
int& ret = dp[l][r] = ;
if(l == r) {
if(l == ||r == n||a[l-] == a[r+]) return ret = ;
else return ret = ;
}
for(int i=l;i<=r;i++) {
ret += 1ll*dfs(l,i-)*dfs(i+,r)%MOD*c[r-l][i-l]%MOD;
ret %= MOD;
}
return ret;
}
void init() {
for(int i=;i<=;i++) {
c[i][] = ;
for(int j=;j<=i;j++) {
c[i][j] = (c[i-][j] + c[i-][j-])%MOD;
}
}
}
int main() {
init();
while(scanf("%d",&n)!=-) {
memset(dp,-,sizeof(dp));
for(int i=;i<=n;i++) scanf("%d",&a[i]);
printf("%d\n",dfs(,n));
}
return ;
}
代码
HDU 5151 Sit sit sit 区间DP + 排列组合的更多相关文章
- hdu5396 Expression 区间dp +排列组合
#include<stdio.h> #include<string> #include<map> #include<vector> #include&l ...
- 【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是素数 ...
- 【BZOJ】4559: [JLoi2016]成绩比较 计数DP+排列组合+拉格朗日插值
[题意]n位同学(其中一位是B神),m门必修课,每门必修课的分数是[1,Ui].B神碾压了k位同学(所有课分数<=B神),且第x门课有rx-1位同学的分数高于B神,求满足条件的分数情况数.当有一 ...
- G.subsequence 1(dp + 排列组合)
subsequence 1 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO Format: %lld 题目描述 You are ...
- hdu 4597 + uva 10891(一类区间dp)
题目链接:http://vjudge.net/problem/viewProblem.action?id=19461 思路:一类经典的博弈类区间dp,我们令dp[l][r]表示玩家A从区间[l, r] ...
- HDU 2476 String painter (区间DP)
题意:给出两个串a和b,一次只能将一个区间刷一次,问最少几次能让a=b 思路:首先考虑最坏的情况,就是先将一个空白字符串刷成b需要的次数,直接区间DP[i][j]表示i到j的最小次数. 再考虑把a变成 ...
- HDU 4597 Play Game(区间DP(记忆化搜索))
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4597 题目大意: 有两行卡片,每个卡片都有各自的权值. 两个人轮流取卡片,每次只能从任一行的左端或右端 ...
- hdu 5115 Dire Wolf(区间dp)
Problem Description Dire wolves, also known as Dark wolves, are extraordinarily large and powerful w ...
- HDU 2476 String painter(区间DP)
String painter Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
随机推荐
- meteor 安装 android sdk慢的改进方法
网上方法很多,最后总结一下比较靠谱的一个,到~/.meteor/android_bundle/ 目录下, 执行tools/android,手动下载 API 19 和 intel X86 Atom Sy ...
- keepalived安装配置(nginx)
环境:centos 6.4 64bit 应用:nginx 目的:keepalived可以让两台服务器处于主备关系,如果主的挂了,备的取得VIP(或者互为主备等关系,文字游戏不纠结), 以实现服务器的高 ...
- 005--VS C++ 加载位图
//全局变量 HDC mdc; //--------------------------------------------InitInstance() 函数--------------------- ...
- Vue2.0的通用组件
饿了么基于Vue2.0的通用组件开发之路(分享会记录) Element:一套通用组件库的开发之路 Element 是由饿了么UED设计.饿了么大前端开发的一套基于 Vue 2.0 的桌面端组件库. ...
- VBS数组函数学习实例分析
Array 函数 返回包含数组的Variant. Array(arglist) 参数:arglist是赋给包含在Variant中的数组元素的值的列表(用逗号分隔).如果没有指定此参数,则将会创建零长度 ...
- 【收藏】win7打开word每次提示配置解决办法
打开“我的电脑”——“ C:\Program Files\Common Files\Microsoft Shared\OFFICE12\Office Setup Controller ”——找到一个“ ...
- 利用Shell命令获取IP地址
一 :获取单个网卡的IPv4地址,方法如下: 方法一:$/sbin/ifconfig ethX | awk '/inet addr/ {print $2}' | cut -f2 -d ":& ...
- android 开发怎么让程序生成的图片文件不会被系统扫描到
我们在写应用的时候,可能会保存很多图片,大的小的,仅仅是我们的应用中会用到,处于种种原因不希望用户看到,我是觉着如果被用户看到了,就失去了我的应用的那一层神秘的面纱,用户是米有闲情逸致去打开你一层层的 ...
- 6、android 普通日志输出到SD卡
这是本人见过写博文最负责的一个人: http://www.crifan.com/android_try_use_android_logging_log4j_to_output_log_to_sd_ca ...
- HDU 5781 ATM Mechine 期望dp
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5781 ATM Mechine Time Limit: 6000/3000 MS (Java/Othe ...