E. Another Filling the Grid 状压dp

Posted bxd123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了E. Another Filling the Grid 状压dp相关的知识,希望对你有一定的参考价值。

  http://codeforces.com/contest/1228/my

 

技术图片

 

 

 题意:有个nm的矩形  每个格子可以取1-k中的一种数字  问有多少种填法  使得每行每列至少都有一个1

 

题解:设置dp[i][j] 表示 当前处理到i行有j列为1的方案数   然后统计答案贡献即可   注意改行至少取一个1

技术图片
#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define repp(i,a,b) for(int i=(a);i>=(b);--i)
#define ll long long
#define see(x) (cerr<<(#x)<<‘=‘<<(x)<<endl)
#define inf 0x3f3f3f3f
#define CLR(A,v)  memset(A,v,sizeof A)
//////////////////////////////////
const int N=300;
const ll mod=1e9+7;
ll dp[N][N],mi[N],mi_1[N],C[N][N],n,k;
int main()

    cin>>n>>k;
    rep(i,0,n)
    
        C[i][0]=1;
        rep(j,1,i)C[i][j]=(C[i-1][j]+C[i-1][j-1])%mod;
    
    mi[0]=mi_1[0]=1;
    rep(i,1,n)mi[i]=mi[i-1]*k%mod,mi_1[i]=mi_1[i-1]*(k-1)%mod;
    rep(i,1,n)dp[1][i]=C[n][i]*mi_1[n-i]%mod;
    rep(i,2,n)rep(j,0,n)rep(s,0,j)
     
      dp[i][j]=(dp[i][j]+dp[i-1][s]*C[n-s][j-s]%mod*mi[s]%mod*mi_1[n-j]%mod)%mod;
      if(j==s)dp[i][j]=(dp[i][j]-mi_1[n]*dp[i-1][s]%mod+mod)%mod;//一定要容斥掉全部非一的方案数
    
    cout<<dp[n][n];
    return 0;
View Code

 

以上是关于E. Another Filling the Grid 状压dp的主要内容,如果未能解决你的问题,请参考以下文章

CF1228E Another Filling the Grid

CF1228E Another Filling the Grid

Codeforces 1228E. Another Filling the Grid

[Codeforces 1228E]Another Filling the Grid (排列组合+容斥原理)

Codeforces Round #589 (Div. 2) Another Filling the Grid (dp)

Codeforces Round #589 (Div. 2)-E. Another Filling the Grid-容斥定理