题目链接

正解:组合数+$dp$。

今天考试的题,考试的时候感觉自己有点脑残过头了。。

似乎发现了所有$1$其实都是一样的,然后不知道怎么强制每种物品只选一个。。

然后就写了一个所有物品可以选任意个的$dp$,尝试与答案找一找规律,并没有找到,看完$std$发现只要再加一个转移就能过了。。所以还是讲讲正解吧。。

首先所有$1$都是一样的,所以我们并不需要状压,直接开一个背包就行。

设$f[i][j]$表示用了$i$个物品,$1$的个数为$j$的方案数,注意这个是有序状态,即使用顺序不同方案也不同。

那么首先枚举当前这个物品让$1$的个数增加了多少,可能为$1,-1,3,-3$,这一步很容易转移。

然后我们之前的转移是枚举的任意物品,必然会算重,而算重的充要条件就是$i$与之前某一个物品是一样的。

我们先强制$i$与$i-1$是相同物品,那么我们可以用$i-2$的状态来转移到$i$,最后我们再乘一个$i-1$表示第$i-1$个物品实际上是可以插到前$i-1$个位置的任意一个的。

最后由于我们算的是排列,所以还要再除以一个$m!$。

通过这道题,我发现我还是太$naive$,见过的套路还是太少了,看来还是要深入学习各种计数的套路。。

 #include <bits/stdc++.h>
#define il inline
#define RG register
#define ll long long
#define rhl (10007)
#define N (1005) using namespace std; int f[N][N],c[N][N],goal[N],n,m,st,fac; il int gi(){
RG int x=,q=; RG char ch=getchar();
while ((ch<'' || ch>'') && ch!='-') ch=getchar();
if (ch=='-') q=-,ch=getchar();
while (ch>='' && ch<='') x=x*+ch-'',ch=getchar();
return q*x;
} il char gc(){
RG char ch=getchar();
while (ch!='' && ch!='') ch=getchar();
return ch;
} il int qpow(RG int a,RG int b){
RG int ans=;
while (b){
if (b&) ans=ans*a%rhl;
if (b>>=) a=a*a%rhl;
}
return ans;
} il void work(){
for (RG int i=;i<n;++i) goal[i]=; st=;
for (RG int i=;i<n;++i) goal[i]^=gc()=='';
for (RG int i=;i<n;++i) goal[i]^=gc()=='';
for (RG int i=;i<n;++i) st+=goal[i]; f[][st]=;
for (RG int i=(fac=);i<=m;fac=fac*(i++)%rhl)
for (RG int j=;j<=n;++j){
f[i][j]=;
if (j) f[i][j]=(1LL*c[j-][]*c[n-j+][]*f[i-][j-]+f[i][j])%rhl;
if (j<n) f[i][j]=(1LL*c[j+][]*c[n-j-][]*f[i-][j+]+f[i][j])%rhl;
if (j->=) f[i][j]=(c[n-j+][]*f[i-][j-]+f[i][j])%rhl;
if (j+<=n) f[i][j]=(c[j+][]*f[i-][j+]+f[i][j])%rhl;
if (i>) f[i][j]=(f[i][j]-1LL*(c[n][]-i+)*f[i-][j]*(i-))%rhl;
}
printf("%d\n",(f[m][]+rhl)*qpow(fac,rhl-)%rhl),f[][st]=; return;
} int main(){
#ifndef ONLINE_JUDGE
freopen("cho.in","r",stdin);
freopen("cho.out","w",stdout);
#endif
c[][]=;
for (RG int i=;i<=;++i){
c[i][]=c[i][i]=;
for (RG int j=;j<i;++j){
c[i][j]=c[i-][j-]+c[i-][j];
if (c[i][j]>=rhl) c[i][j]-=rhl;
}
}
while (scanf("%d%d",&n,&m)!=EOF && (n|m)) work();
return ;
}

poj3718 Facer's Chocolate Dream的更多相关文章

  1. 【poj3718】 Facer's Chocolate Dream

    http://poj.org/problem?id=3718 (题目链接) 题意 给出${2}$个长度为${n}$的${01}$串,问是否存在${m}$个长度为${n}$的有三个位置为${1}$的$0 ...

  2. PK淘宝BUY+,京东推出AR购物应用JD Dream

        今年双十一淘宝推出了虚拟现实VR购物"BUY+",用户可以在虚拟环境中选购商品.那作为竞争对手的京东将使出什么绝招呢?在近日上海举办的谷歌开发者大会上得到了答案.会上京东推 ...

  3. [poj2411] Mondriaan's Dream (状压DP)

    状压DP Description Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One nigh ...

  4. Dream It Possible

    反复听着Dream It Possible,想起自己的华为岁月,百感交集!

  5. POJ 题目2411 Mondriaan's Dream(状压DP)

    Mondriaan's Dream Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 13519   Accepted: 787 ...

  6. 第一篇英文短文《It All Starts With A Dream》

    http://www.ximalaya.com/#/17209107/sound/6883165 Dreaming. Do you or don’t you? Do you dream about t ...

  7. POJ 2411 Mondriaan&#39;s Dream

    状压DP Mondriaan's Dream Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 9938 Accepted: 575 ...

  8. Big Chocolate

    Big Chocolate 题目链接:http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=19127 Big Chocolat ...

  9. Dividing a Chocolate(zoj 2705)

    Dividing a Chocolate zoj 2705 递推,找规律的题目: 具体思路见:http://blog.csdn.net/u010770930/article/details/97693 ...

随机推荐

  1. 写Markdown费事?Typora让你像写word一样行云流水,所见即所得。

    Typora 简介 Typora删除了预览窗口,以及所有其他不必要的干扰.取而代之的是实时预览. Markdown的语法因不同的解析器或编辑器而异,Typora使用的是GitHub Flavored ...

  2. RxJS库

    介绍 RxJS是一个异步编程的库,同时它通过observable序列来实现基于事件的编程.它提供了一个核心的类型:Observable,几个辅助类型(Observer,Schedulers,Subje ...

  3. dapper 多对多查询对象和对象列表

    splitOn参数:用来指定列为分隔列,之前的列为前一对象,之后的列为后一对象. lookup 用来保存中间处理结果,可以理解为将结果归组出Group对象,并为其RightsList添加内容, 注意: ...

  4. Knockout.js Text绑定

    <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8&quo ...

  5. word转html实现预览(asp.net)

    word转html 需要通过nuget 安装 Microsoft.Office.Interop.Word Microsoft.Office.Interop.Excel 使用 Microsoft.Asp ...

  6. 七、并发容器ConcurrentHashMap

    一.简介 我们知道,HashMap是线程不安全的.而HashTable是线程安全的,但是JDK已经不建议使用HashTable,它已经被作为废除的实现. 在JDK并发包里面,ConcurrentHas ...

  7. SpringFramework中重定向

    需求: 需要在两个@Controller之间跳转,实现重定向 解决: @PostMapping("/files/{path1}") public String upload(... ...

  8. HTML骨架详解

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. HotSpot 虚拟机中对象的创建过程

  10. 用手机访问管理mysql

    移动办公的情况及需求越来越多,平时MySQL,Oracle,SQLServer等数据库的管理都要通过客户端工具操作,现在有一款基于web网页的软件:TreeSoft数据库管理系统,在服务器布署一套后, ...