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