洛谷 P2051 中國象棋 題解

2022-09-05 19:54:11 字數 873 閱讀 4796

題面

狀態可能不太好想,設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[i][j][k]*(j);  在有乙個棋子的j行中隨機選擇乙個放下乙個炮,則擁有兩個炮的行數便加1;

f[i+1][j-2][k]+=f[i][j][k]*c(m-k-j,2);  在剩餘的m-k-j個空行中隨機選擇兩個不相同的行(利用組合數);

f[i+1][j][k+1]+=f[i][j][k]*(m-k-j)*j;   選擇乙個放了乙個炮的行和乙個沒放炮的行各放乙個炮;

f[i+1][j-2][k+2]+=f[i][j][k]*c(j,2);  選擇兩個放了乙個炮的行各放乙個炮;

注意陣列的下標不可以是負數!!!!!

ans就是sigma(f[n][j][k])(j+k<=m)

注意邊界處理 ,a[0][0][0]=1;

#include #define int long long

#define p 9999973

using

namespace

std;

intn,m;

int f[110][110][110

];int c(int

n)signed main()}}

long

long ans=0

;

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

}cout

<}

洛谷 P2051 中國象棋

orz stdcall 首先要想出來,每行最多只能放兩個棋子,這是顯然的 於是決策就是一行一行地處理 30分的做法就是裸的列舉,暴搜,列舉這一行放 放幾個 然後想到了壓位dp,按3進製表示當前棋盤的狀態,即某一列沒有棋子,或者有乙個,兩個棋子,能過50分 接著可以發現,棋子的順序是無所謂的,並不需要...

洛谷P2051 中國象棋

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

洛谷P2051 中國象棋

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