這次小可可想解決的難題和中國象棋有關,在乙個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
題解:每行每列只能放置0~2個棋子,所以可以按行順序dp,每行放置0~2個保證行合法(轉移過程限制這個條件),用dp[i][j][k]表示前i行有j列有1個棋子,有k列有兩個棋子,保證列合法(狀態陣列dp限制了這個條件)
1 #include2 #include3 #include4 #include5view codeusing
namespace
std;
6 typedef long
long
ll;7
const ll mod=9999973
;8 ll dp[105][105][105];9
ll c(ll x)
12int
main()35}
3637
}38 cout
39return0;
40 }
P2051 AHOI2009 中國象棋
這次小可可想解決的難題和中國象棋有關,在乙個 n 行 m 列的棋盤上,讓你放若干個炮 可以是 0個 使得沒有乙個炮可以攻擊到另乙個炮,且它們之間恰好 有乙個棋子。你也來和小可可一起鍛鍊一下思維吧!一行包含兩個整數 n,m之間由乙個空格隔開。總共的方案數,由於該值可能很大,只需給出方案數模 99999...
P2051 AHOI2009 中國象棋 (dp)
傳送門 n和m太大了,狀壓dp不行。換一種方式 定義f i j k 為前i行中有就 j 列放了乙個,k列放了2個的方案數。總共有m列,什麼也沒放的有 s m j k 列。第 i 行有三種選擇不放,放乙個 放s或j中,k已經放不下了 放兩個 全放s,乙個s乙個j,兩個j 需要注意一直保持 s j k ...
題解 P2051 AHOI2009 中國象棋
題目鏈結 題目大意 求在 n 行 m 列的棋盤上放置若干個炮使得它們互不攻擊的方案數,對 9999973 取模 動態規劃,計數 分析 沒有炮互相攻擊等價於沒有三個炮在同一行 列 考慮用 f i m 1 m 2 表示前 i 行,有 m 1 列有乙個炮,m 2 列有兩個炮的方案數 可以用刷表法降低思維難...