HDU 5151 Sit sit sit 区间dp
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=5151
题解:
有n个椅子,编号为1到n。
现在有n个同学,编号为1到n,从第一个同学开始选择要坐的位子,并且这个同学不能坐同时满足下面三个条件的椅子。
1、左右都有相邻的位子
2、左右相邻的位子都是空的。
3、左右两边的位子颜色不同。
问总共有多少种坐法。
题解:
dp[i][j]表示坐满编号为i到j的椅子的类数。
现在第一个开始坐的人选择的是第t个位子,则dp[i][j]+=dp[i][t-1]*dp[t+1][j]*C[j-i][t-i],其中组合数C表示安排t-i个人在左边的组合数。
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std; typedef long long LL;
const int mod = 1e9 + ;
const int maxn = ; int n;
int arr[maxn];
LL dp[maxn][maxn],C[maxn][maxn]; void pre() {
C[][] = ;
for (int i = ; i < maxn; i++) {
C[i][] = ;
for (int j = ; j <= i; j++) {
C[i][j] = (C[i-][j - ] + C[i - ][j]) % mod;
}
}
} LL dfs(int i, int j) {
if (i == j) return dp[i][j] = ;
if (i > j) return ;
if (dp[i][j] != -) return dp[i][j];
LL &ret = dp[i][j] = ;
ret=(ret+dfs(i + , j)+dfs(i, j - ))%mod;
for (int mid = i + ; mid <= j - ; mid++) {
if (arr[mid - ] ^ arr[mid + ]) continue;
ret =(ret+dfs(i, mid - )*dfs(mid + , j)%mod*C[j - i][mid - i])%mod;
}
return ret;
} void init() {
memset(dp, -, sizeof(dp));
} int main() {
pre();
while (scanf("%d", &n) == && n) {
init();
for (int i = ; i <= n; i++) scanf("%d", arr + i);
LL ans=dfs(, n);
printf("%lld\n", ans);
}
return ;
}
HDU 5151 Sit sit sit 区间dp的更多相关文章
- 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 ...
- HDU 4745 Two Rabbits(区间DP,最长非连续回文子串)
Two Rabbits Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others) Total ...
- HDU 5115 Dire Wolf ——(区间DP)
比赛的时候以为很难,其实就是一个区间DP= =..思路见:点我. 区间DP一定要记住先枚举区间长度啊= =~!因为区间dp都是由短的区间更新长的区间的,所以先把短的区间更新完.. 代码如下: #inc ...
- hdu 3632 A Captivating Match(区间dp)
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=3632 题意:n个人进行比赛,每个人有一个价值a[i],最后冠军只有一个,只能相邻两个人进行 ...
- HDU 3506 Monkey Party(区间DP)题解
题意:有n个石堆排成环,每次能合并相邻的两堆石头变成新石堆,代价为新石堆石子数,问最少的总代价是多少 思路:先看没排成环之前怎么做:用dp[i][j]表示合并i到j所需的最小代价,那么dp[i][j] ...
- HDU 5900 QSC and Master 区间DP
QSC and Master Problem Description Every school has some legends, Northeastern University is the s ...
随机推荐
- 我都使用了这些VS插件
VS作为一个.net开发的必备工具,当然有必要将其打造成一个利器!所以,安装一些必要的插件来增强它是最佳的选择! 首先不得不说一下,Resharper太有用了! 接下来的这一些插件,对我来说,也都是比 ...
- objective-C常量与变量
1.Objective-C中声明常量使用关键字const.如:const double PI = 3.1514; 2.Objective-C中变量可以分为成员变量.局部变量和全局变量(用的很少,尽量不 ...
- 登陆peoplesoft的时候显示信息
Signon Event Message Select selectPeopleTools, then selectUtilities, then selectAdministration, then ...
- SQL中查看数据库各表的大小
SQL中查看数据库各表的大小 编写人:CC阿爸 2014-6-17 在日常SQL数据库的操作中,如何快速的查询数据库中各表中数据的大小. 以下有两种方法供参考: 第一种: create table # ...
- 配置pxe 自动化安装centos6.7
dhcp服务器是pxe自动化安装的必要条件,因此先搞定dhcp服务器,yum -y install dhcp, rpm -ql dhcp查看安装了哪些包,less /etc/dhcp/dhcpd.c ...
- .Net并行编程
1.什么是线程?线程和进程的区别是什么? 线程是程序执行的最小单元. 区别: 进程是操作系统进行资源处理和分配的最小单位,而一个进程可以包含多个线程,并共享进程的资源. 2.什么是多线程?为什么设计多 ...
- 相比于汇编语言的准确性c语言延时精确度如何提升
只要合理的运用,C还是可以达到意想不到的效果.很多朋友抱怨C效率比汇编差了很多,其实如果对Keil C的编译原理有一个较深入的理解,是可以通过恰当的语法运用,让生成的C代码达到最优化.即使这看起来不大 ...
- 如何在Eclipse中配置Tomcat
1.Eclipse EE 配置Tomcat Eclipse EE 主要用于Java Web开发和J2EE项目开发.Eclipse EE中配置Tomcat比较简单,新建一个Tomcat Server即可 ...
- rman 命令
OS: Oracle Linux Server release 5.7 DB: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - ...
- expdp与impdp
参考http://blog.csdn.net/hello985/article/details/13295305 (一) 导出scott用户下的emp表到xx用户下 1.1 创 ...