51Nod 1327 棋盤遊戲 延遲DP

2022-05-12 10:40:59 字數 1056 閱讀 9517

題目:

看部落格:

思路就是按列dp,如果不是必須填就先空下這一列,記錄一下目前有多少可用的空列,遇到乙個 l 的結束時就從中選一些列放上棋子,並乘個排列;

對於 r,方案數在當前列體現,所以要記錄當前列可填的位置;

注意別漏了狀態,當前可轉移的狀態是填 l,填 r,不填,填在不是 l 也不是 r 的地方四種轉移;

還有各種細節...全仰仗 narh 提點;

呆滯了半小時...一對拍就發現...在算 a 的地方別忘了寫 (ll) !!!

好題啊!

**如下:

#include#include

#include

#include

using

namespace

std;

typedef

long

long

ll;int

const xn=55,xm=205,mod=1e9+7

;int

n,m,l[xn],r[xn],f[xm][xm][xm],jc[xm],jcn[xm],sl[xm],sr[xm];

intrd()

while(ch>='

0'&&ch<='

9')ret=(ret<<3)+(ret<<1)+ch-'

0',ch=getchar();

return f?ret:-ret;

}ll pw(ll a,

intb)

void

init()

int a(int n,int m)//

(ll)!!!

void upt(int &x,int y)

intmain()

int ans=0;

for(int j=0;j<=m-2*n;j++)upt(ans,f[m][j][n]);

//,printf("f[%d][%d][%d]=%d\n",m,j,n,f[m][j][n]);

printf("

%d\n

",ans);

return0;

}

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 ...

51nod1327 棋盤遊戲 dp

description 有乙個n n 行m role presentation style position relative m m列的棋盤,即該棋盤被分為n m n m 格。現在向棋盤中放棋子,每個格仔中最多放乙個棋子,也可以乙個不放。放完棋子後需要滿足如下要求 1 1 對於第i行來說,其從左往...