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 的地方四...