AHOI2009 中國象棋

2022-05-16 21:36:11 字數 970 閱讀 3855

記錄下第一次過省選難度的題。

由題意可知每一列和每一行能同時存在的炮都不能超過2個,否則就會互毆。那麼只需要記錄每一行有1個炮的列數和有2個炮的列數遞推即可。

設狀態dp[i][j][k]其中i代表行數,j代表該行有j列已經放置了乙個棋子,k代表有k列已經放了2個棋子。

之後只需要對當前行放置0,1,2棵炮的情況進行遞推即可

dp[i][j][k]=dp[i-1][j][k];

if(j>=1)dp[i][j][k]+=dp[i-1][j-1][k]*(m-j-k+1);

if(k>=1)dp[i][j][k]+=dp[i-1][j+1][k-1]*(j+1);

if(j>=2)dp[i][j][k]+=dp[i-1][j-2][k]*(((m-j-k+2)*(m-j-k+1))/2);

if(k>=1)dp[i][j][k]+=dp[i-1][j][k-1]*j*(m-j-k+1);

if(k>=2)dp[i][j][k]+=dp[i-1][j+2][k-2]*(j+2)*(j+1)/2;

#include#define mod 9999973

using

namespace

std;

long

long dp[105][105][105

];int

main()}}

long

long ans=0

;

for(int j=0;j<=m;j++)

}cout

<}

AHOI2009中國象棋

狀態很難想。本題難就難在如何定狀態。再看題解之前,我一點思路也沒有。看到題解的狀態表示後,我立刻知道怎麼做了。f i j k 表示至第i行,有j列放1個,有k列放2個。這樣f i j k 即為第i行不放 放1個 放2個的數量總和。狀態轉移方程很長,用到組合的相關知識。i 1時需特殊處理。詳見 inc...

AHOI2009 中國象棋

題目描述 這次小可可想解決的難題和中國象棋有關,在乙個n行m列的棋盤上,讓你放若干個炮 可以是0個 使得沒有乙個炮可以攻擊到另乙個炮,請問有多少種放置方法。大家肯定很清楚,在中國象棋中炮的行走方式是 乙個炮攻擊到另乙個炮,當且僅當它們在同一行或同一列中,且它們之間恰好 有乙個棋子。你也來和小可可一起...

AHOI2009 中國象棋

這次小可可想解決的難題和中國象棋有關,在乙個 n n 行m role presentation style position relative m m列的棋盤上,讓你放若干個炮 可以是 0 0 個 使得沒有乙個炮可以攻擊到另乙個炮,請問有多少種放置方法。大家肯定很清楚,在中國象棋中炮的行走方式是 乙...