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

Posted wmj6

tags:

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

技术图片

 

 题意:问有多少种组合方法让每一行每一列最小值都是1

思路:我们可以以行为转移的状态 附加一维限制还有多少列最小值大于1 这样我们就可以不重不漏的按照状态转移 但是复杂度确实不大行(减了两个常数卡过去的...)

技术图片
#include <bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;
const double eps = 1e-6;
const int N = 3e5+7;
typedef long long ll;
const ll mod = 1e9+7;
using namespace std;
ll dp[300][300];
ll qpow(ll a,ll b)
    ll ans=1; ll base=a;
    while(b)
        if(b&1) ans=ans*base%mod;
        base=base*base%mod;
        b>>=1;
    
    return ans;

ll C[255][255];
int main()
    C[0][0]=1;
    for(int i=1;i<=250;i++)
        C[i][0]=1;
        for(int j=1;j<=i;j++)C[i][j]=(C[i-1][j]+C[i-1][j-1])%mod;
    
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    int n,k; cin>>n>>k;
    for(int i=0;i<n;i++)
        dp[1][i]=qpow(k-1,i)*C[n][i]%mod;
    
    for(int i=2;i<=n;i++)
        for(int j=0;j<n;j++)
            ll x=qpow(k-1,j);
            ll y=qpow(k-1,n);
            for(int l=j;l<n;l++)
                dp[i][j]=(dp[i][j]+dp[i-1][l]*x%mod*qpow(k,n-l)%mod*C[l][j]%mod)%mod;
                if(j==l)
                    dp[i][j]=(dp[i][j]-y*dp[i-1][l]%mod+mod)%mod;
                
            
        
    
    cout<<dp[n][0]<<endl;
    return 0;
View Code

技术图片

 

 

 预处理前后差别

以上是关于Codeforces Round #589 (Div. 2) Another Filling the Grid (dp)的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #589 (Div. 2)

Codeforces Round #589 (Div. 2)

codeforces round 589

Codeforces Round #589 (Div. 2) A. Distinct Digits

Codeforces Round #589 (Div. 2) (ef没写)

Codeforces Round #589 (Div. 2) - A