【BZ1925] [SDOI2010]ゴブリン部族

【BZ1925] [SDOI2010]ゴブリン部族

ポータル

DPは非常に興味深い質問。

私たちは、使用するかどうかの各順列の数を考慮することが困難であるためことがわかったので、私たちはただ相対的な関係を維持すると思います。

我々は新たな場所を検討するとき、ランキングの新たな位置に割り当てられた番号(この位置のサイズは元の2つの場所のサイズの中央に挿入されるように理解することができます)。

だから、注文\(DP [i]は[J ] [0/1] \) 私は、番号iは、i番目の立ち上がり/立ち下がり時に、最後の二つの数字は関係が対向している、フロントJ位にランクされて前に数を表しプログラムの数。

そこである
。。。\ [DP [I] [J] [0] = \ sum_ K = {} 1 1} ^ {J-DP [1-I] [K] [1] \\ DP [I] [J] [1] = \ sum_ {K = J} ^ {I-1} DP [I-1] [K] [0] \\ DP [1] [1] [1] = DP [1] [1]〜[ 0] = 1; \]
次に、プレフィクスおよび最適化をクリックしてください
[F [I] [J] [0] = \ sum_ K = {1} ^ {J} DP [I] [J] [0] \\ F \ [I] [J] [1
] = \ sum_ {k = 1} ^ {J} DP [I] [J] [1]〜\\ \] 次に転送である:
\ [DP [I] [J] [0 ] = F [I-1] [J-1] [1] \\ DP [I] [j]は、[1] Fを= [I-1] [I-1] [0] [I-1] -f [J-1] [0] \\ 初期化:[1] [1] fは
[0]、F [1] [1] [1] = 1 \] = コード:

#include<iostream>
#include<cstdio>
#include<algorithm>
const int maxn=4500;
using namespace std;
int n,p;
int dp[2][maxn][2],f[2][maxn][2];
int main() {
    scanf("%d%d",&n,&p);
    dp[1][1][0]=dp[1][1][1]=f[1][1][1]=f[1][1][0]=1;
    for(int i=2;i<=n;i++) {
        int md=i&1;
        for(int j=1;j<=i;j++)dp[md][j][0]=dp[md][j][1]=0;
        for(int j=1;j<=i;j++) {
            dp[md][j][0]+=f[md^1][j-1][1];dp[md][j][0]%=p;
            dp[md][j][1]+=f[md^1][i-1][0]-f[md^1][j-1][0];dp[md][j][1]%=p;
        }
        for(int j=1;j<=i;j++) {
            f[md][j][0]=f[md][j-1][0]+dp[md][j][0];f[md][j][0]%=p;
            f[md][j][1]=f[md][j-1][1]+dp[md][j][1];f[md][j][1]%=p;
        }
    }
    printf("%d",(((f[n&1][n][1]+f[n&1][n][0])%p)+p)%p);
}

おすすめ

転載: www.cnblogs.com/GavinZheng/p/11620731.html