最近经常做到组合计数的题目,每当看到这种题目第一反应总是组合数学,然后要用到排列组合公式,以及容斥原理之类的。。然后想啊想,最后还是不会做。。

但是比赛完之后一看,竟然是dp。。例如前几天的口号匹配求方案数的题目,今天的uva4656,以及hdu4248都是这种类型的题目。。

说说uva4565吧。

题意大概意思是:有N种纸牌,G给位置。。然后给定每种纸牌最少排几张,求满足的方案。

这样一来我们怎么划分状态呢?以位置?

不,我们得用纸牌来划分状态,并枚举纸牌之前用了几张

那么用f[i][j]表示前I个纸牌已经满足题意,且总共放了j个位置的方案数。那么 f[i][j] = sigma(f[i-1][k] * c[G - k][j - k]){j - k >= a[i]}

至于为什么是 f[i-1][k] * c[G - k][j - k],我们可以这样理解:

反正总的位置固定,选取的j-k个在剩下的G-k个里选择位置就行了。。(这样不会有问题吧)

hdu4248:

这一题自己懒得写了,转自这个博客http://www.cnblogs.com/sweetsc/archive/2012/07/17/2595189.html

我觉得写得很不错!

题意:有N种石头,每种石头有A1,A2....AN个,现取出一些石头组成序列,求可以组成多少种序列

例如:3种:可以产生:B; G; M; BG; BM; GM; GB; MB; MG; BGM; BMG; GBM; GMB; MBG; MGB.

我们采用动态规划的思想,划分阶段:按照石头种类划分阶段。于是乎,咱们对于第i种石头,相当于之前石头的颜色并不重要,借助高中数学插板法的思想,假如之前的i - 1 种石头,拼出了长      度为len,那么,相当于有len + 1个空,咱们要放第 i 种石头进去,于是乎,转化成了经典问题,我比较得意的总结:

球和球 盒和盒 空盒 情况数
有区别 有区别 有空盒 m^n
有区别 有区别 无空盒 M!s(n,m)
有区别 无区别 有空盒 S(n,1)+s(n,2)+…+s(n,m),n>=m
      S(n,1)+s(n,2)+…+s(n,n),n<=m
有区别 无区别 无空盒 S(n,m)
无区别 有区别 有空盒 C(n+m-1,n)
无区别 有区别 无空盒 C(n-1,m-1)
无区别 无区别 有空盒 DP
无区别 无区别 无空盒 DP

这里,第 i 种石头互相没有区别,len + 1个空有序,相当于有区别,可以有空盒,于是,如果咱们从第 i 种中放put个进去,情况数应该是 C(put + len , put)

于是设计状态:DP[i][j] 表示 用前 i 种石头,排出长度为 j 的可能数

然后,状态转移的时候,枚举在阶段 i 放入put个,DP[i + 1][j + put] += DP[i][j] * C(put + j, put) 即可

附上自己奇丑无比的代码:

Uva4656

#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <set>
#include <stack>
#include <cmath>
#include <vector>
#include <algorithm>
#define MXN 50100
#define Inf 101010
#define M0(a) memset(a, 0, sizeof(a))
using namespace std;
double c[][], f[][];
int a[], sum[];
int n, m;
void init(){
M0(c);
for (int i = ; i <= ; ++i)
c[i][] = ;
for (int i = ; i <= ; ++i)
for (int j = ; j <= i; ++j)
c[i][j] = c[i-][j] + c[i-][j-];
} void solve(){
M0(sum);
M0(f);
scanf("%d%d", &n, &m);
for (int i = ; i <= m; ++i){
scanf("%d", &a[i]);
sum[i] = sum[i-] + a[i];
}
f[][] = ;
for (int i = ; i <= m; ++i)
for (int j = sum[i]; j <= n; ++j){
for (int k = a[i]; k <= j; ++k)
f[i][j] += f[i-][j-k] * c[n - j + k][k];
}
for (int i = ; i <= n; ++i)
f[m][n] /= m;
printf("%.6lf\n", f[m][n] * 100.00);
} int main(){
// freopen("a.in", "r", stdin);
// freopen("a.out","w", stdout);
int T, cas = ;
scanf("%d", &T);
init();
for (int i = ; i <= T; ++i){
printf("Case #%d: ", i);
solve();
} // fclose(stdin); fclose(stdout);
}

hdu4248

#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <set>
#include <stack>
#include <cmath>
#include <vector>
#include <algorithm>
#define MXN 50100
#define Inf 101010
#define P 1000000007
#define M0(a) memset(a, 0, sizeof(a))
using namespace std;
int c[][];
long long f[][];
int n, a[], m, sum[]; void init(){
for (int i = ; i <= ; ++i)
c[i][] = ;
for (int i = ; i <= ; ++i)
for (int j = ; j <= && j <= i; ++j)
c[i][j] = (c[i-][j] + c[i-][j-]) % P;
} void solve(){
m = ;
M0(f);
M0(sum);
for (int i = ; i <= n; ++i){
scanf("%d", &a[i]);
m += a[i];
sum[i] = m;
}
f[][] = ;
long long ans = ;
for (int i = ; i <= n; ++i)
for (int j = ; j <= sum[i]; ++j){
for (int k = ; k <= a[i]; ++k){
if (k > j) break;
f[i][j] = (f[i][j] + f[i-][j-k] * c[j][k]) % P;
}
if (i == n && j) ans = (ans + f[i][j]) % P;
}
printf("%I64d\n", ans);
} int main(){
//freopen("a.in", "r", stdin);
// freopen("a.out","w", stdout);
int T, cas = ;
init();
while (scanf("%d", &n) != EOF){
printf("Case %d: ", ++cas);
solve();
} fclose(stdin); fclose(stdout);
}

方案dp。。的更多相关文章

  1. NOIP2006金明的预算方案[DP 有依赖的背包问题]

    题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱就行”.今 ...

  2. cf1140E 回文串+染色方案dp

    有点硬核的dp..要用到一个结论.. /* 把原串拆成奇偶串,再拆成极大连续的-1串:该串两端都是非-1数,中间都是-1,并且下标要么都是偶数,要么都是技术 然后对所有这些串进行dp,dp[i][0] ...

  3. BZOJ1079:[SCOI2008]着色方案(DP)

    Description 有n个木块排成一行,从左到右依次编号为1~n.你有k种颜色的油漆,其中第i种颜色的油漆足够涂ci个木块. 所有油漆刚好足够涂满所有木块,即c1+c2+...+ck=n.相邻两个 ...

  4. luogu P1417 烹调方案 |dp

    题目背景 由于你的帮助,火星只遭受了最小的损失.但gw懒得重建家园了,就造了一艘飞船飞向遥远的earth星.不过飞船飞到一半,gw发现了一个很严重的问题:肚子饿了~ gw还是会做饭的,于是拿出了储藏的 ...

  5. PS8625替代方案CS5211|CS5211可以替代兼容PS8625方案|DP转LVDS芯片方案

    PS8625|Parade普瑞 PS8625|Parade普瑞 PS8625芯片|Parade普瑞 PS8625方案|Parade普瑞 PS8625芯片代理|DP转LVDS|PS8625替代方案CS5 ...

  6. CS5218替代AG6310方案设计|替代AG6310方案|DP转HDMI 4K30Hz转换方案

    AG6310是一款实现显示端DP口转HDMI数据转换器.AG6310是一款单芯片解决方案,通过DP端口连接器传输视频和音频流,其DP1.2支持可配置的1.2和4通道,分别为1.62Gbps.2.7Gb ...

  7. CapstoneCS5212替代IT6516方案|DP转VGA芯片|替代兼容IT6516

    台湾联阳IT6516是一种高性能的DP显示端口到VGA转换器方案芯片.IT6516结合DisplayPort接收器和三重DAC,通过转换功能支持DisplayPort输入和VGA输出.内置Displa ...

  8. bzoj 1079: [SCOI2008]着色方案 DP

    1079: [SCOI2008]着色方案 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 803  Solved: 512[Submit][Status ...

  9. BZOJ.2660.[BJOI2012]最多的方案(DP)

    题目链接 首先我们知道: 也很好理解.如果相邻两项出现在斐波那契表示法中,那它们显然可以合并. 所以我们能得到\(n\)的斐波那契表示,记\(pos[i]\)为\(n\)的斐波那契表示法中,第\(i\ ...

随机推荐

  1. NC 6系预警类型注册

    在实际开发预警任务中,因为模块是新创建的,所以开发预警,就要在相应的节点模块注册.但这样代码就得放在相应的模块中,注册个预警类型,就可以把代码直接放在自己新建的模块. .先执行新建模块语句 inser ...

  2. Java时代即将来临

    Java语言开发成型的时候有一个构想:就是智能设备互联,笔者推断这个时代即将来临. 我们看看信息时代经历的几个阶段: 机械设备阶段--以算盘.机械式计算机为代表的萌芽阶段. 电子管计算机阶段--以简单 ...

  3. 最详细的Axure动态面板使用教程

    1.打开[Axure]软件,在index文件上新建一个375*667大小的背景矩形并绘制页面. 具体如图所示. 2.在banner的位置上新建一个[动态面板],双击动态面板在其中新建state1.st ...

  4. [Chrome Headless + Python] 截长图 (Take Full-page Screenshot)

    # -*- coding: utf-8 -*- import time import os from selenium import webdriver from selenium.webdriver ...

  5. HTML5中的Web Notification桌面通知(右下角提示)

    html5桌面通知(Web Notifications)对于需要实现在新消息入线时,有桌面通知效果的情况下非常有用,在此简单介绍一下这个html5的新属性.通过Web Notifications(桌面 ...

  6. 重新设置Linux的IP地址(该操作会永久更改ip地址)

    1.查看你当前的IP地址 2.进入配置文件进行更改IP地址 3.上图我使用的是ifcfg-eth1 ,然后进行更改这个文件 4.点击“insert”进行编辑改文档,吧对应的IP改成你想要的地址 更改完 ...

  7. 【转载】 H264的I/P/B帧类型判断

    http://blog.csdn.net/zhuweigangzwg/article/details/44152239 这里首先说明下H264的结构: 00 00 00 01/00 00 01-> ...

  8. springMVC学习 四 请求的中文乱码解决

    在使用SpringMVC时,同样有前端向后端发送请求,请求参数中有中文,需要解决中文乱码问题,在Spring中也是向java web中一样,通过一个过滤器来解决中文乱码. 这个过滤器在spring-w ...

  9. 查看tomcat运行日志

    1.先到tomcat的logs目录下我这边是:/usr/local/apache-tomcat-7.0.73/logs 2.tail -f catalina.out 3.这样,前端有请求时候,就会输出 ...

  10. tensorflow下识别手写数字基于MLP网络

    # coding: utf-8 # In[1]: import tensorflow as tf import tensorflow.examples.tutorials.mnist.input_da ...