zoukankan      html  css  js  c++  java
  • 洛咕 P2467 [SDOI2010]地精部落

    同波浪,简单dp。

    高度从1到n插入山脉,设f[i][j][k]表示插入了i个山脉,组成了j段,边界上有k个山脉的方案数。

    那么新插入的山脉只会:插入在边界上且自己是一段、插入在边界上且与最左边的段相连、不在边界上且自己是一段、不在边界上且连接两段。

    大力讨论即可

    // luogu-judger-enable-o2
    #include<bits/stdc++.h>
    #define il inline
    #define vd void
    typedef long long ll;
    il int gi(){
        int x=0,f=1;
        char ch=getchar();
        while(!isdigit(ch)){
            if(ch=='-')f=-1;
            ch=getchar();
        }
        while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
        return x*f;
    }
    int f[4201][4201][3];// 插入了i个山,有j段
    int main(){
    #ifndef ONLINE_JUDGE
        freopen("2467.in","r",stdin);
        freopen("2467.out","w",stdout);
    #endif
        int n=gi(),p=gi();
        f[0][0][0]=1;
        for(int i=0;i<n;++i)
            for(int j=0;j<=i;++j)
                for(int k=0;k<3;++k){
                    if(!f[i][j][k])continue;
                    if(k^2){
                        f[i+1][j+1][k+1]=(f[i+1][j+1][k+1]+1ll*f[i][j][k]*(2-k))%p;
                        f[i+1][j][k+1]=(f[i+1][j][k+1]+1ll*f[i][j][k]*(2-k))%p;
                    }
                    f[i+1][j+1][k]=(f[i+1][j+1][k]+1ll*f[i][j][k]*(j+1-k))%p;
                    f[i+1][j-1][k]=(f[i+1][j-1][k]+1ll*f[i][j][k]*(j-1))%p;
                }
        printf("%d
    ",f[n][1][2]);
        return 0;
    }
    
  • 相关阅读:
    codeforces 189A
    hdu 2085
    hdu 2083
    cf 1237 C2. Balanced Removals (Harder)
    cf 1244 D. Paint the Tree
    cf 1241 E. Paint the Tree(DP)
    cf 1241 D. Sequence Sorting(思维)
    cf1228 D Complete Tripartite(哈希)
    Windows10 与 WSL(Ubuntu)的文件互访
    Ubuntu下运行python文件
  • 原文地址:https://www.cnblogs.com/xzz_233/p/9815858.html
Copyright © 2011-2022 走看看