AHOI2009 中國象棋

2022-02-28 15:36:48 字數 1457 閱讀 4793

旁邊的dalao們,神們,都在做什麼樹套樹平衡樹lct仙人掌模擬退火ac自動機……只有筆者這個蒟蒻弱弱的在寫dp。這道dp還是很有技術含量的。。

先分析一下題目,簡單來說就是給乙個矩陣,要求再裡面放棋子,每行每列的棋子要<=2,問有多少種不同的放置方法。首先分析小資料,n,m均<=6,爆搜即可出解。然後那50%估計是有什麼nm^3的做法,然而筆者太弱了沒想出來。那麼接著分析100%。

考慮到這個題就給了你行和列,所以我們以 行 為大方向考慮動歸方程。思考,這麼一來我們每行最多只能放兩個棋子,那麼如果我們以f[i][j][k]來表示到第i行已經有j列放了乙個棋子,k列放了兩個棋子的方法數量,那麼dp完成後我們的答案就是sum(f[n][1...m][1...m])。考慮如何轉移:

首先,我們在下一行不放棋子,那麼直接轉移這一行的方案數就可以了。

①我們在當前已經有乙個棋子的一列在放乙個棋子,那麼狀態變為f[i+1][j-1][k+1],而我們可以這麼做的方案數就是已經放了j列乙個棋子的j。

②我們從找一列乙個棋子都沒有的,放乙個棋子,那麼狀態變為f[i+1][j+1][k],我們能這麼做的次數就是當前沒有放旗子的列數(m-j-k)。

最後我們考慮在下一行放兩個棋子,仍然需要分情況討論,

①我們把這兩個棋子全都放到已經有棋子的列,那麼狀態變為f[i+1][j-2][k+2],我們可行的不同的方案數就是從j個裡面選出兩個的數量也就是cj

2。②我們放乙個棋子在已經有棋子的一列,而另乙個放在沒有棋子的一列,那麼狀態變為f[i+1][j][k+1],可行的不同方案數的個數是可以放有乙個棋子的j和乙個棋子都沒有的(m-j-k)的乘積。

③我們把兩個棋子都放在原來沒有棋子的列上,那麼狀態變為f[i+1][j+2][k],我們可行的方案數是。。

適當的%有益於身心,**確實不長,但是確實是一道dp好題。

1 #include2 #include3 #include4 #include5 #include6 #include7

#define inf 5000001

8#define re register

9#define ll long long

10#define min(a,b) a11

#define maxn 5000007

12#define mo 9999973

13using

namespace

std;

14 ll f[201][201][201

],n,k,m;

15 inline ll c(int

x)16

19int

main()

2037

}38 ll ans=0;39

for(re int i=0;i<=m;i++)

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

41 ans=(ans+f[n][i][j])%mo;

42 cout<43 }

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 個 使得沒有乙個炮可以攻擊到另乙個炮,請問有多少種放置方法。大家肯定很清楚,在中國象棋中炮的行走方式是 乙...