看了題後,可以發現一行最多兩個炮,一列最多兩個炮。
做狀壓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 個 使得沒有乙個炮可以攻擊到另乙個炮,請問有多少種放置方法。大家肯定很清楚,在中國象棋中炮的行走方式是 乙...