AHOI2009 中國象棋

2021-08-19 20:57:09 字數 1576 閱讀 4376

這次小可可想解決的難題和中國象棋有關,在乙個

n n

行m' role="presentation" style="position: relative;">m

m列的棋盤上,讓你放若干個炮(可以是

0 0

個),使得沒有乙個炮可以攻擊到另乙個炮,請問有多少種放置方法。大家肯定很清楚,在中國象棋中炮的行走方式是:乙個炮攻擊到另乙個炮,當且僅當它們在同一行或同一列中,且它們之間恰好 有乙個棋子。你也來和小可可一起鍛鍊一下思維吧!

一行包含兩個整數

n' role="presentation" style="position: relative;">nn,

m m

,之間由乙個空格隔開。

總共的方案數,由於該值可能很大,只需給出方案數模

9999973

' role="presentation" style="position: relative;">9999973

9999973

的結果。13

1 37

7

除了3' role="presentation" style="position: relative;">3

3個格仔裡都塞滿了炮以外,其它方案都是可行的,所以一共有2∗

2∗2−

1=7 2∗2

∗2−1

=7

種方案。

100 100

%的資料中

n n

和m' role="presentation" style="position: relative;">m

m均不超過

100 100

50 50

%的資料中

n n

和m' role="presentation" style="position: relative;">m

m至少有乙個數不超過

8 8

30' role="presentation" style="position: relative;">30

30%的資料中

n n

和m' role="presentation" style="position: relative;">m

m均不超過

6 6

根據此題的資料範圍,是網路流/狀態壓縮dp的複雜度,顯然可以看出這是乙個狀態壓縮dp,因為每列最多只能放0~2個棋子,所以可以考慮敲乙個3進製的狀態壓縮dp,下面附上**及解決思路

#include

#include

#define maxn 110

#define mod 9999973

using

namespace

std;

long

long f[maxn][maxn][maxn];

long

long n,m;

int main()

}

}long

long ans=0;

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

}cout

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行m列的棋盤上,讓你放若干個炮 可以是0個 使得沒有乙個炮可以攻擊到另乙個炮,請問有多少種放置方法。大家肯定很清楚,在中國象棋中炮的行走方式是 乙個炮攻擊到另乙個炮,當且僅當它們在同一行或同一列中,且它們之間恰好 有乙個棋子。你也來和小可可一起...