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;
    }
    
  • 相关阅读:
    css 样式库
    css命名规则
    css选择器
    清除浏览器自带样式
    导航菜单制作
    清除浮动和样式重置快捷代码
    程序练习网站
    各种布局样式模板
    使用gulp解决外部编辑器修改Eclipse文件延迟刷新
    jQuery Validate 表单验证 — 用户注册简单应用
  • 原文地址:https://www.cnblogs.com/xzz_233/p/9815858.html
Copyright © 2011-2022 走看看