AHOI2009 中國象棋

2022-05-09 10:51:13 字數 1032 閱讀 1737

嘟嘟嘟

啊我好菜啊,dp從來都做不出來……

這題我換了好幾種狀態但就是和題解不一樣……

首先明確的一點是,每行每列最多有兩個棋子,然後放置的方案數和順序是無關的。所以沒必要記錄是怎麼放的。

令dp[i][j][k]表示共\(i\)行,有\(j\)列放了1個棋子,有\(k\)列放了2個棋子(剩下的列就是沒放棋子啦)的方案數。

然後列舉第\(i\)行放幾個棋子,以及怎麼放,轉移方程看**吧。

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

#define enter puts("")

#define space putchar(' ')

#define mem(a, x) memset(a, x, sizeof(a))

#define in inline

typedef long long ll;

typedef double db;

const int inf = 0x3f3f3f3f;

const db eps = 1e-8;

const int maxn = 105;

const int mod = 9999973;

inline ll read()

inline void write(ll x)

int n, m;

ll dp[maxn][maxn][maxn];

in void inc(ll& x, ll y)

in ll c2(int n)

int main()

ll ans = 0;

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

for(int j = 0; i + j <= m; ++j) inc(ans, dp[n][i][j]);

write(ans), enter;

return 0;

}

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