洛谷 P2051 中國象棋

2022-05-10 05:45:55 字數 630 閱讀 5022

orz__stdcall

首先要想出來,每行最多只能放兩個棋子,這是顯然的

於是決策就是一行一行地處理

30分的做法就是裸的列舉,暴搜,列舉這一行放**,放幾個

然後想到了壓位dp,按3進製表示當前棋盤的狀態,即某一列沒有棋子,或者有乙個,兩個棋子,能過50分

接著可以發現,棋子的順序是無所謂的,並不需要準確知道當前棋盤的狀態

於是有了100分做法:dp[i][j][k]表示放了前i行,有j列是有1個棋子,有k列有兩個棋子

然後列舉所有的轉移即可

#include #include #include #include #include using namespace std;

const int mod = 9999973;

long long n, m, dp[105][105][105];

long long c(long long num)

int main()

} }long long ans = 0ll;

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

} cout << ans << endl;

return 0;

}

洛谷P2051 中國象棋

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

洛谷P2051 中國象棋

題意 在乙個n行m列的棋盤上,讓你放若干個炮,可以是0個,使得沒有乙個炮可以攻擊另乙個炮,請問有多少種放置方法。題解 因為每一行每一列的炮的數量 2 考慮開dp陣列儲存有幾列放了乙個炮,有幾列放了兩個炮 dpi k 表示放了前i行,有j列是有乙個棋子,有k列是有2個棋子的合法方案數 空的序列就是合法...

洛谷 P2051 中國象棋 題解

題面 狀態可能不太好想,設f i j k 表示前i行其中有j行是放乙個炮,有k行是放兩個炮的合法方案數 那麼 f i 1 j k f i j k 在這一行不放任何棋子 f i 1 j 1 k f i j k m k j 在剩餘的m k j個空行中隨機選擇乙個放下乙個炮 f i 1 j 1 k 1 f...