AHOI2009 中國象棋

2022-05-12 00:45:11 字數 1755 閱讀 1769

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

輸入格式:

一行包含兩個整數n,m,之間由乙個空格隔開。

輸出格式:

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

輸入樣例#1:

1 3

輸出樣例#1:

7

樣例說明

除了3個格仔裡都塞滿了炮以外,其它方案都是可行的,所以一共有2*2*2-1=7種方案。

資料範圍

100%的資料中n和m均不超過100

50%的資料中n和m至少有乙個數不超過8

30%的資料中n和m均不超過6

f[i][j][k] 表示已經放了前i行,其中有j列是只放了1個炮,有k列放了2個炮的方案數

有: 1〉如果第i行不放,有

f[i][j][k]:=f[i][j][k]+f[i-1][j][k];

2〉如果第i行放乙個棋子,且這個棋子放在已經放了乙個棋子的列上,有

f[i][j][k]:=f[i][j][k]+f[i-1][j+1][k-1]*(j+1);

3〉如果第i行放乙個棋子,且這個棋子放在已放了0個棋子的列上,有:

f[i][j][k]:=f[i][j][k]+f[i-1][j-1][k]*(m-j-k+1);

4〉如果第i列放兩個棋子,且兩個棋子都放在空列上,有:

f[i][j][k]:=f[i][j][k]+f[i-1][j-2][k]*(m-j+2-k);

5〉如果第i列放兩個棋子,且兩個棋子乙個放在已經放了乙個棋子的列,另乙個放在放了0個棋子的列。有

f[i][j][k]:=f[i][j][k]+f[i-1][j+2][k-2]*(j+2)*(j+1)div 2 ;

6〉如果第i列放兩個棋子,且這兩個棋子都放在已經放過1個棋子的列上,有:

f[i][j][k]:=f[i][j][k]+f[i-1][j][k-1]*j*(m-j-k+1);

1 #include2 #include3 #include4 #include5

using

namespace

std;

6 typedef long

long

lol;

7int mod=9999973

;8 lol f[101][101][101

],ans;

9lol n,m;

10int

main()

1133}34

}35for (i=0;i<=m;i++)

36for (j=0;j+i<=m;j++)

37 ans=(ans+f[n][i][j])%mod;

38 cout<<(ans+mod)%mod;

39 }

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