poj3718 Facer's Chocolate Dream
正解:组合数+$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的更多相关文章
- 【poj3718】 Facer's Chocolate Dream
http://poj.org/problem?id=3718 (题目链接) 题意 给出${2}$个长度为${n}$的${01}$串,问是否存在${m}$个长度为${n}$的有三个位置为${1}$的$0 ...
- PK淘宝BUY+,京东推出AR购物应用JD Dream
今年双十一淘宝推出了虚拟现实VR购物"BUY+",用户可以在虚拟环境中选购商品.那作为竞争对手的京东将使出什么绝招呢?在近日上海举办的谷歌开发者大会上得到了答案.会上京东推 ...
- [poj2411] Mondriaan's Dream (状压DP)
状压DP Description Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One nigh ...
- Dream It Possible
反复听着Dream It Possible,想起自己的华为岁月,百感交集!
- POJ 题目2411 Mondriaan's Dream(状压DP)
Mondriaan's Dream Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 13519 Accepted: 787 ...
- 第一篇英文短文《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 ...
- POJ 2411 Mondriaan's Dream
状压DP Mondriaan's Dream Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 9938 Accepted: 575 ...
- Big Chocolate
Big Chocolate 题目链接:http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=19127 Big Chocolat ...
- Dividing a Chocolate(zoj 2705)
Dividing a Chocolate zoj 2705 递推,找规律的题目: 具体思路见:http://blog.csdn.net/u010770930/article/details/97693 ...
随机推荐
- 详解 Webpack+Babel+React 开发环境的搭建
1.认识Webpack 构建应用前我们先来了解一下Webpack, Webpack是一个模块打包工具,能够把各种文件(例如:ReactJS.Babel.Coffeescript.Less/Sass等) ...
- maven+tomcat热部署
1.首先修改tomcat安装目录下的conf文件夹中的tomcat-user.xml文件 <role rolename="manager-gui"/> <role ...
- [javaSE] 网络编程(TCP-并发上传图片)
客户端: 1.服务端点 2.读取客户端已有的图片数据 3.通过socket输出流将数据发给服务端 4.读取服务端反馈信息 5.关闭 获取Socket对象,new出来,构造参数:String的服务端ip ...
- 二:HTML基础
一:html语言基础 1.基本结构 <html> <head> <!--元信息:提供额外信息:关键字.作者信息.页面更新时间.设置字符编码--> <meta ...
- netty源代码编译_mac os
工作中会用到netty,有随手整理笔记的习惯,故学习整理下,之前看过了理论知识,接下来就看下源码了,先来编译下 个人 fork git:https://github.com/ending06/nett ...
- java:模拟栈操作
import java.util.ArrayList; public class MyStack { private ArrayList<Object> arrayList; public ...
- CentOS 安装Parallels Tools
为了做到Mac和Linux之间共享文件夹,因此需要安装Parallels Tool, 具体安装步骤可以参考 install parallels tool for linux guest http:// ...
- Java关闭钩子的应用 - Shutdown Hook
背景 在开发中,遇到这种情况,多个线程同时工作,突然一个线程遇到了fetal的错误,需要立即终止程序,等人工排查解决了问题之后重新启动.但是这样会有一个问题,程序终止时,其他线程可能正在进行重要操作, ...
- C#学习笔记-继承基本知识
namespace Inheritance { class Program { static void Main(string[] args) { Dog dog = new Dog(); dog.A ...
- csharp: Gets a files formatted size.
/* ASP.NET 默认上传文件是4M ,可以修改服务配置.. <system.web> <!-- 指示 ASP.NET 支持的最大文件上载大小. 该限制可用于防止因用户将大量文件 ...