AHOI2009 中國象棋 狀壓dp 狀態新穎

2021-09-12 12:53:19 字數 1329 閱讀 5754

看了題後,可以發現一行最多兩個炮,一列最多兩個炮。

做狀壓dp一般都是枚舉行來做,所以一行兩炮可以在一次for中列舉出來,但列上炮的數量不好計算。看了dalao的題解,發現狀態這樣設定

d p[

i][j

][k]

dp[i][j][k]

dp[i][

j][k

],ii

i代表列舉的行數,j

jj代表有j

jj有1個棋子,k

kk表示有k

kk列有兩個棋子

於是狀態轉移有

不放放乙個在:無棋子的列上(乘上沒有棋子的個數) / 乙個棋子的列上(乘上有乙個棋子的個數)

放兩個在:都在無棋子的列上(乘上cn2

c_n^2

cn2​

,n

nn為沒有棋子的列數) / 乙個在乙個棋子列上,乙個在無棋子列上(乘上兩種列數的個數) / 兩個都在乙個棋子列上 (乘上cn2

c_n^2

cn2​

,n

nn為有乙個棋子的列數)

詳細看**

#include

#define int long long

using

namespace std;

inline

void

read

(int

&x)while

(ch >=

'0'&& ch <=

'9')

x *= f;

}inline

void

max(

int&x,

int y)

const

int n =

101;

const

int mod =

9999973

;int n, m, ans;

int f[n]

[n][n]

;inline

intc

(int x)

signed

main()

for(

int i =

0; i <= m; i++

)for

(int j =

0; i + j <= m; j++

)(ans +

= f[n]

[i][j])%

= mod;

//把所有狀態累計就是答案

printf

("%lld\n"

, ans)

;return0;

}

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