這次小可可想解決的難題和中國象棋有關,在乙個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
然後我想到了壓位dp,按3進製表示當前棋盤的狀態,即某一列沒有棋子,或者有乙個,兩個棋子,能過50分
接著可以發現,棋子的順序是無所謂的,並不需要準確知道當前棋盤的狀態
於是有了100分做法:dp[i][j][k]表示放了前i行,有j列是有1個棋子,有k列有兩個棋子、
1 #include2 #include3 #include4 #include5 #include6#define mod 9999973
7#define int long long
8#define r register
9using
namespace
std;
10 inline void
in(int &x)
1114
while(isdigit(s))
15 x*=f;16}
17int
n,m,ans;
18int f[108][108][108
];19 inline int c(int
x)20
23signed main()
2441}42
}43for(r int i=0;i<=m;i++)
44for(r int j=0;j<=m;j++)
45 (ans+=f[n][i][j])%=mod;
46 printf("
%lld
",(ans+mod)%mod);
47 }
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 個 使得沒有乙個炮可以攻擊到另乙個炮,請問有多少種放置方法。大家肯定很清楚,在中國象棋中炮的行走方式是 乙...