题目链接

正解:组合数+$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. openvpn应用场景案例【转】

    转载至:http://www.linuxfly.org/post/86/ 一.案例1 针对不同的客户端指定不同的等级和权限.通常的方法是:1.每个客户端分配不同的IP地址:2.利用防火墙对不同的IP地 ...

  2. 在方法中new关键字的用处

    如果在类A中有M1这个方法需方法 public virtual ovid m1() { console.writeline(“我的世界”); } 那么你在类B中继承的时候可以重写这个方法,也可以不重写 ...

  3. 【11】Redis .net 实例 StackExchange.Redis框架

    1.创建测试项目并下载nuget包:StackExchange.Redis PM> Install-Package StackExchange.Redis 2.创建 RedisHelper类 p ...

  4. 一、cent OS安装配置JDK

    到oracle官网下载JDKhttp://www.oracle.com/technetwork/java/javase/downloads/index-jsp-138363.html 在cent OS ...

  5. fuzhou 1683 纪念SlingShot ***

    Problem 1683 纪念SlingShot Accept: 361    Submit: 1287Time Limit: 1000 mSec    Memory Limit : 32768 KB ...

  6. spss C# 二次开发 学习笔记(六)——Spss统计结果的输出

    Spss的二次开发可以很简单,实例化一个对象,然后启用服务,接着提交命令,最后停止服务. 其中重点为提交命令,针对各种统计功能需求,以及被统计分析的数据内容等,命令的内容可以很复杂,但也可以简单的为一 ...

  7. HTML颜色的三种写法

    颜色的三种写法: 1.16进制代码     #000000 2.英文字母         red 3.rgba                rgba(0-255,0,0,0-1) 例如: <b ...

  8. csharp: Linq keyword example

    /// <summary> /// http://www.dotnetperls.com/linq /// </summary> public partial class Li ...

  9. jQuery自适应-3D旋转轮播图

    3D旋转轮播图 本例源于(站长之家实例http://sc.chinaz.com/jiaoben/170215391070.htm) 其他相似示例(https://www.cnblogs.com/inc ...

  10. JavaScript周报#184

    This week’s JavaScript news Read this issue on the Web | Issue Archive JavaScript Weekly Issue 184Ju ...