题目链接

正解:组合数+$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. Cannot find module 'rxjs/operators/share'

    描述: ionic项目,在使用了ngx-translate之后,项目编译完成,运行到浏览器时,出现如下错误: 其中ngx-translate参照官网最新教程使用,并且也尝试了angular4.3之前的 ...

  2. C# 之多线程(一)

    概述: 1.进程:是操作系统结构的基础:是一个正在执行的程序:计算机中正在运行的程序实例:可以分配给处理器并由处理器执行的一个实体:由单一顺序的执行显示,一个当前状态和一组相关的系统资源所描述的活动单 ...

  3. 如鹏网学习笔记(六)ADO.Net基础

    ADO.Net基础 一.ADO.Net简介 1,程序要通过SQL语句自动化的操作数据库,必须要用一个类库, 类库要提供execute("insert into ...")/exec ...

  4. linux端口开放

      netstat 查看端口开放情况: netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 ...

  5. 理解B+树算法和Innodb索引

    一.innodb存储引擎索引概述: innodb存储引擎支持两种常见的索引:B+树索引和哈希索引. innodb支持哈希索引是自适应的,innodb会根据表的使用情况自动生成哈希索引. B+树索引就是 ...

  6. uwsgi/uWSGI/WSGI简介

    参考文章 uWSGI是一个Web服务器,它实现了WSGI协议.uwsgi.http等协议.Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换.z WSGI是一种Web服务器网 ...

  7. C#学习笔记(基础知识回顾)之值传递和引用传递

    一:要了解值传递和引用传递,先要知道这两种类型含义,可以参考上一篇 C#学习笔记(基础知识回顾)之值类型和引用类型 二:给方法传递参数分为值传递和引用传递. 2.1在变量通过引用传递给方法时,被调用的 ...

  8. js-js的不重载

    * 什么是重载?方法名相同,参数列表不同 - Java里面有重载 * js里面不存在重载! <html> <head> <title>World</title ...

  9. BZOJ1492 [NOI2007]货币兑换

    Description 小Y最近在一家金券交易所工作.该金券交易所只发行交易两种金券:A纪念券(以下简称A券)和 B纪念券(以下 简称B券).每个持有金券的顾客都有一个自己的帐户.金券的数目可以是一个 ...

  10. Myeclipse下集成SVN插件

    一.下载SVN插件subclipse   下载地址:http://subclipse.tigris.org/servlets/ProjectDocumentList?folderID=2240   在 ...