【题解】HDU4689 Derangement(有技巧的计数DP)
【题解】HDU4689 Derangement(有技巧的计数DP)
呵呵没告诉我多测组数,然后\(n\le 20,7000\mathrm{ms}\)我写了个状压上去T了
题目大意:
要你求错排的方案数,但要求\(i\)位上的数比\(i\)大/小。大小关系用正负号告诉你,读入一个字符串。
\(O(n2^n)\)
设\(dp(s)\)表示已经放了\(|s|\)个数进去,放的数占满了\(s\)中的位置的方案数
转移太显然直接贴代码
//@winlere
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define DE(s) cerr<<(#s)<<"="<<(s)<<endl;
#define lowbit(x) ((x)&-(x))
using namespace std; typedef long long ll;
inline int qr(){
register int ret=0,f=0;
register char c=getchar();
while(!isdigit(c))f|=c==45,c=getchar();
while(isdigit(c)) ret=ret*10+c-48,c=getchar();
return f?-ret:ret;
}
const int maxn=20;
int n,U;
ll dp[1<<maxn];
char c[maxn];
int main(){
while(~scanf("%s",c)){
n=strlen(c);
dp[0]=1;
U=(1<<n)-1;
for(int t=1;t<=U;++t){
dp[t]=0;
int cnt=0;
for(int g=t;g;g-=lowbit(g)) ++cnt;
for(int i=0,g=t;i<n&&g;++i){
if(g>>i&1){
if(c[i]=='+'&&cnt>i+1) dp[t]+=dp[t^(1<<i)];
if(c[i]=='-'&&cnt<i+1) dp[t]+=dp[t^(1<<i)];
g^=1<<i;
}
}
}
printf("%lld\n",dp[U]);
}
return 0;
}
过不了 别想了
\(O(n^2)\)
考虑+号是一个后缀性的匹配,-号是一个前缀型的匹配。也就是说我们不可能直接把数给选好,要在后面再进行选择。这启发我可以设这样的状态:
\(dp(i,j)\)表示已经考虑前\(i\)个符号,但是需要从后面拉来\(j\)个\(>i\)数来凑齐前面的\(“+”\)。
当前是负号:
当前位置上的数拿来匹配前面的+
\[\]\[
\]\[\]\[
\]当前位置上的数拿来匹配前面一个+
\[\]\[
\]\[\]\[\]
//@winlere
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define DE(s) cerr<<(#s)<<"="<<(s)<<endl
#define lowbit(x) ((x)&-(x))
using namespace std; typedef long long ll;
inline int qr(){
register int ret=0,f=0;
register char c=getchar();
while(!isdigit(c))f|=c==45,c=getchar();
while(isdigit(c)) ret=ret*10+c-48,c=getchar();
return f?-ret:ret;
}
const int maxn=25;
int n,U;
ll dp[maxn][maxn];
char c[maxn];
int main(){
while(~scanf("%s",c+1)){
n=strlen(c+1);
memset(dp,0,sizeof dp);
dp[0][0]=1;
int cnt_minus=0,cnt_plus=0;
for(int t=1;t<=n;++t){
if(c[t]=='-') {
for(int i=0;i<=cnt_plus;++i)
dp[t][i]=dp[t-1][i+1]*(t-1-(cnt_plus-(i+1))-cnt_minus)*(i+1ll)*(i+1<=cnt_plus)+dp[t-1][i]*(t-1-(cnt_plus-i)-cnt_minus);
++cnt_minus;
}
else {
for(int i=0;i<=cnt_plus+1;++i){
if(i) dp[t][i]+=dp[t-1][i-1];
dp[t][i]+=dp[t-1][i]*i;
}
++cnt_plus;
}
}
printf("%lld\n",dp[n][0]);
}
return 0;
}
【题解】HDU4689 Derangement(有技巧的计数DP)的更多相关文章
- 题解报告:hdu 1028 Ignatius and the Princess III(母函数or计数DP)
Problem Description "Well, it seems the first problem is too easy. I will let you know how fool ...
- 计数dp+概率+大数——(抽屉问题解的个数)zoj3380
难的地方在于计数dp..给定范围[1,n]的数去填m个位置,要求不能出现超过I个相同的数, 那就用dp[i][j]表示在阶段i,已经填了j个位置的可能解法,那么只要枚举i填的位置数k∈[0,min(j ...
- [DP之计数DP]
其实说实在 我在写这篇博客的时候 才刚刚草了一道这样类型的题 之前几乎没有接触过 接触过也是平时比赛的 没有系统的做过 可以说0基础 我所理解的计数dp就是想办法去达到它要的目的 而且一定要非常劲非常 ...
- 【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是素数 ...
- 【AtCoder】AGC022 F - Leftmost Ball 计数DP
[题目]F - Leftmost Ball [题意]给定n种颜色的球各k个,每次以任意顺序排列所有球并将每种颜色最左端的球染成颜色0,求有多少种不同的颜色排列.n,k<=2000. [算法]计数 ...
- 【BZOJ】4559: [JLoi2016]成绩比较 计数DP+排列组合+拉格朗日插值
[题意]n位同学(其中一位是B神),m门必修课,每门必修课的分数是[1,Ui].B神碾压了k位同学(所有课分数<=B神),且第x门课有rx-1位同学的分数高于B神,求满足条件的分数情况数.当有一 ...
- 【计数dp】Array Without Local Maximums
参考博客:[CF1068D]Array Without Local Maximums(计数DP) [题意] n<=1e5 dp[i][j][k]表示当前第i个数字为j,第i-1个数字与第i个之间 ...
- [Hdu-5155] Harry And Magic Box[思维题+容斥,计数Dp]
Online Judge:Hdu5155 Label:思维题+容斥,计数Dp 题面: 题目描述 给定一个大小为\(N*M\)的神奇盒子,里面每行每列都至少有一个钻石,问可行的排列方案数.由于答案较大, ...
- TZOJ 5962 Happy Matt Friends(计数DP)
描述 Matt hzs N friends. They are playing a game together. Each of Matt’s friends has a magic number. ...
随机推荐
- 对比MySQL,一文看透HBase的能力及使用场景
MySQL + HBase 是我们日常应用中常用的两个数据库,分别解决应用的在线事务问题和大数据场景的海量存储问题. 本文内容适合初次理解HBase的读者,包括技术.功能及场景,也欢迎老司机们补充和温 ...
- 从HelloWorld看Knative Serving代码实现
摘要: Knative Serving以Kubernetes和Istio为基础,支持无服务器应用程序和函数的部署并提供服务.我们从部署一个HelloWorld示例入手来分析Knative Servin ...
- day3_python之函数参数
一.形参 在定义函数时,括号内的参数称为形参,特点:形参就是变量名 def foo(x, y): # x=1,y=2 print(x) print(y) 二.实参 在调用函数时,括号内的参数成为实参, ...
- selenium webdriver学习(十)------------如何把一个元素拖放到另一个元素里面(转)
selenium webdriver学习(十)------------如何把一个元素拖放到另一个元素里面 博客分类: Selenium-webdriver 元素拖放drag and drop Q群里 ...
- centos 磁盘挂载
1.更改磁盘格式 fdisk -l fdisk /dev/vdb mkfs.xfs /dev/vdb1 mkfs.xfs /dev/vdb1 -f 2.查看UUID blkid 3.挂载文件夹 vim ...
- img的alt和title的异同?
alt 是图片加载失败时,显示在网页上的替代文字: title 是鼠标放上面时显示的文字,title是对图片的描述与进一步说明; 这些都是表面上的区别,alt是img必要的属性,而title不是. 对 ...
- 基于BERT预训练的中文命名实体识别TensorFlow实现
BERT-BiLSMT-CRF-NERTensorflow solution of NER task Using BiLSTM-CRF model with Google BERT Fine-tuni ...
- python基础十之装饰器
1,装饰器的形成 编程原则:开放封闭原则. 开放:对扩展是开放的 封闭:对修改是封闭的 因为修改是封闭的,所以为了对函数进行功能的扩展,就使用装饰器! 2,装饰器的定义 # wrapper就是一个装饰 ...
- 【js】react-native Could not find iPhone 6 simulator 和 Entry, ":CFBundleIdentifier", Does Not Exist 两种报错解决办法
一.在运行rn app应用时,react-native run:ios 报错出现 Could not find iPhone 6 simulator 解决办法: 1.react-native r ...
- ES6,ES7重点介绍
1. 字符串模板 <!--旧版拼接字符串--> var str = '我是时间:'+new Date(); <!--新版拼接字符串--> let str = `我是时间${ne ...