标签:
1 1 2 2 2 3
1 7 25HintThere are 7 possible arrangements for the second test case. They are: 11 11 11 10 11 01 10 11 01 11 01 10 10 01 Assume that a grids is ‘1‘ when it contains a jewel otherwise not.
dp题,我们一行一行的考虑。dp[i][j],表示前i行,都满足了每一行至少有一个宝石的条件,而只有j列满足了有宝石的条件的情况有多少种。枚举第i+1行放的宝石数k,这k个当中有t个是放在没有宝石的列上的,那么我们可以得到转移方程:
dp[i+1][j+t]+=dp[i][j]*c[m-j][t]*c[j][k-t],其中c[x][y],意为在x个不同元素中无序地选出y个元素的所有组合的个数。
//187MS 1200K
#include<stdio.h>
#include<algorithm>
#include<string.h>
#define ll long long
#define mod 1000000007
using namespace std;
ll dp[57][57],c[57][57];
void calc()//求组合数
{
for(int i=0;i<51;i++)
{
c[i][0]=1;
for(int j=1;j<=i;j++)
c[i][j]=(c[i-1][j-1]+c[i-1][j])%mod;
}
}
int main ()
{
calc();
int n,m;
while (scanf ("%d%d",&n,&m)!=EOF)
{
memset(dp,0,sizeof(dp));
dp[0][0]=1;
for(int i=1;i<=n;i++)//第i行
for(int k=1;k<=m;k++)//第k列
for(int j=0;j<=k;j++)//上一行亮多少个
for(int t=max(1,k-j);t<=k;t++)//这一行放多少个
dp[i][k]=(dp[i][k]+dp[i-1][j]*c[m-j][k-j]%mod*c[j][t-(k-j)])%mod;
printf("%d\n",dp[n][m]%mod);
}
return 0;
}
HDU 5147 Harry And Magic Box dp+组合数
标签:
原文地址:http://blog.csdn.net/crescent__moon/article/details/42393209