51nod1327 棋盤遊戲 dp

2021-08-17 21:07:00 字數 2621 閱讀 8847

description:

有乙個n

n

行m' role="presentation" style="position: relative;">m

m列的棋盤,即該棋盤被分為n∗

m n∗m

格。現在向棋盤中放棋子,每個格仔中最多放乙個棋子,也可以乙個不放。放完棋子後需要滿足如下要求: 1)

1

)對於第i行來說,其從左往右的前le

ft[i

] lef

t[i]

個格仔(即最左側的le

ft[i

] lef

t[i]

個連續的格仔)中恰好一共有

1 1

個棋子; 2)

' role="presentation" style="position: relative;">2)2

)對於第i行來說,其從右往左的前ri

ght[

i]r ig

ht[i

]個格仔(即最右側的ri

ght[

i]r ig

ht[i

]個連續的格仔)中恰好一共有

1 1

個棋子; 3)

' role="presentation" style="position: relative;">3)3

)對於每一列來說,這一列上的所有格仔內含有的棋子數不得超過1個

1 個。

其中,1

) 1

)與2)

2

)條件中,對所有

i i

滿足le

ft[i

]+ri

ght[

i]<=

m' role="presentation" style="position: relative;">lef

t[i]

+rig

ht[i

]<=ml

eft[

i]+r

ight

[i]<=

m,即兩個區間不會相交。

問,符合上述條件情況下棋子的不同放法一共有多少種?輸出放法的個數 mo

d1,000

,000

,007

m od

1,

000,

000,

007後的結果。

solution:

由於同時有le

ftl ef

t和ri

ght rig

ht

,不能同時進行dp

d

p,否則複雜度**。那麼考慮滿足所有le

ftl ef

t的方案,那麼在每個le

ftl ef

t結束前都要選完。設dp

[i][

j][k

] dp[

i][j

][k]

表示選到第

i i

列,有j' role="presentation" style="position: relative;">j

j列空著,還有

k k

個righ

t' role="presentation" style="position: relative;">rig

htri

ght沒選。先計算每列有多少個le

ftl ef

t結束點,ri

ght rig

ht

起始點,和空著的點。那麼考慮加入新的一列,這列裡的le

ftl ef

t結束點必須選完,那麼就是在空著的列中放置這些le

ftl ef

t。乘上排列即可。新加入的列也可以放置其他兩種格仔,分別計算即可。

#include 

using namespace std;

const int maxn = 205, p = 1e9 + 7;

int n, m;

long long fac[maxn], c[maxn][maxn], a[maxn], b[maxn], c[maxn], l[maxn], r[maxn], dp[maxn][maxn][maxn];

void upd(long long &x, long long y)

int main()

if(j == l[i])

if(j == m - r[i] + 1) }}

c[0][0] = 1;

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

}fac[0] = 1;

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

dp[0][0][0] = 1;

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

if(j >= b[i + 1]) }}

}}}long long ans = 0;

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

printf("%lld\n", ans);

return 0;

}

51nod 1327 棋盤遊戲

有乙個n行m列的棋盤,即該棋盤被分為n m格。現在向棋盤中放棋子,每個格仔中最多放乙個棋子,也可以乙個不放。放完棋子後需要滿足如下要求 1 對於第i行來說,其從左往右的前left i 個格仔 即最左側的left i 個連續的格仔 中恰好一共有1個棋子 2 對於第i行來說,其從右往左的前right i...

棋盤遊戲 51Nod 1327

題解 在放置棋子時僅僅要求左右滿足條件與n的順序無關,考慮乙個二維dp陣列,dp i j 代表放到了第i列還有j列沒有放棋子,但是這個二維dp沒有維護右限的資訊,所以考慮增加一維代表有多少行到達了右限但沒有棋子,將l和r區間的限制統計,可以得到dp轉移方程 dp a 1 b 1 l a 1 c r ...

51Nod 1327 棋盤遊戲 延遲DP

題目 看部落格 思路就是按列dp,如果不是必須填就先空下這一列,記錄一下目前有多少可用的空列,遇到乙個 l 的結束時就從中選一些列放上棋子,並乘個排列 對於 r,方案數在當前列體現,所以要記錄當前列可填的位置 注意別漏了狀態,當前可轉移的狀態是填 l,填 r,不填,填在不是 l 也不是 r 的地方四...