POJ 3046 Ant Counting DP题目

题目大意:有T个种类的蚂蚁family,下面给你a只蚂蚁,数字代表来自第几个family的,求在这a只中取出x只组成长度大小在[s,b]之间的集合数量有多少个。

转化一下题意,给你T种类型 a 个个体,从中任取 [s,b] 个组成的集合个数有多少个。

这道题用 DP 的思想解答。

令 dp[i][j] 表示前i个种类中组合成大小为j的集合的个数。

所以可以枚举 1~T 种之间,每一种 a[i-1](这里i-1是因为将1~T种替换成0~T-1种,便于后面的枚举计算) 个可以组成多少种集合

所以就有转移方程 dp[i][j] = dp[i-1][j] + dp[i][j-1],意思就是枚举到当前第i种的时候,可以看成的是前i-1种组成的大小为j的集合中一个元素替换成当前枚举的种类(dp[i-1][j]) 加上 当前到第i种组成的大小是j-1的集合中再加上一个元素(dp[i][j-1])的数量。

当然在枚举的过程中还要特判一个条件,就是当前集合的大小 j-1>=a[i-1] 时,意思就是当前枚举的种类中没有多出的可以替换(或者替换)以前枚举过的集合中的元素了,如果要保持继续枚举,就要减去多余的一些情况,这些情况对应可以看成是dp[i-1][(多出来的元素个数)],这样就可以继续了,最后ans就是dp[t][s]~dp[t][b]的总和。代码实现如下。 


如果有问题欢迎提出来,也欢迎提出错误。