AHOI2009 中國象棋

2021-09-28 07:10:26 字數 1002 閱讀 6260

題目描述

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

輸入格式

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

輸出格式

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

一開始就想著用狀壓dp,可這題資料量有點大,壓不了,看了題解後才搞懂,很新奇的乙個dp狀態,dp[i][j][k]:

i表示前i行,j表示有j列棋子個數為1,k表示有k列棋子個數為2。

這樣可以保證每一列的合法性,然後每次向i+1行遞推時,只放0,1,2個棋子,從而保證每一行的合法性。

遞推式的話就分別考慮每種情況,例如:放乙個棋子,放在有0個棋子的行,放在有1個棋子的行。把所有情況考慮即可。

過程中會爆int,用long long

#include

#include

#include

#include

#define max 0x3f3f3f3f

typedef

long

long ll;

using namespace std;

const

int maxn=

105;

ll dp[maxn]

[maxn]

[maxn]

;//前i行,有j *列放了1個棋子,k *列放了2個棋子

intmain()

}}ll ans=0;

for(

int j=

0; j<=m; j++)}

printf

("%lld\n"

,ans)

;}

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