BZOJ 1801 中國象棋

2021-07-23 20:31:31 字數 529 閱讀 2851

題解:

顯然問題就是一行一列最多只能放兩個棋子,求方案數

dp:f[i][j][k]表示前i行已經有j列有乙個棋子,k列有兩個棋子的方案數

那麼第i行可以不放棋子、放乙個棋子、放兩個棋子。

其中,棋子可以放在原來沒有棋子的某一列上,也可以放在已經有乙個棋子的某一列上。但是已經有兩個棋子的列上是不能放的。

然後要分6種情況討論下。這裡想法其實不難,但是容易亂……我還wa了一次

1、不放

2、乙個棋子,放在原來沒棋子的某一列上

3、乙個棋子,放在原來有乙個棋子的某一列上

4、兩個棋子,乙個在原來沒棋子的列上,乙個在原來乙個棋子的列上

5、兩個棋子,都放在原來沒棋子的列上

6、兩個棋子,都放在原來乙個棋子的列上

#include#include#include#include#includeusing namespace std;

const int mod = 9999973,n =

BZOJ1801 中國象棋

很久之前就聽說過這道題了,當時就覺得很難。一種很暴力的思想是,用狀壓dp做,記錄每一行的各個狀態,但顯然,只可以拿50分 也不少 這裡用到一種dp優化的思想,合併本質相同的狀態,實際上,我們並不太關心每一行的擺放情況,真正影響方案數的是,放到某一行,已經放了1個的列數,放了2個的列數及空列,知道了這...

AHOI2009中國象棋

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

AHOI2009 中國象棋

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