洛谷 P1896 SCOI2005 互不侵犯

2022-03-03 07:58:07 字數 769 閱讀 7526

狀壓dp入門題

狀壓dp一般需要與處理狀態是否合法,節省時間

設定狀態dp[i][j][k]表示第i行第j個狀態選擇國王數為k的方案數

$dp[i][j][num[j]+p]+=dp[i-1][k][p]$

轉移方程如上,表示第i行第j個狀態國王數量為$num[j]+p$由上一行第k個狀態的p個國王轉移而來

狀壓dp的一般套路不就是將數的二進位制表示成狀態,如1010(10)10這個數就表示第乙個位置放,第二個不放,以此類推

預處理:判斷這一行的國王是否衝突,i&(i<<1) 想象成二進位制,將i左移一位與i比較判斷國王是否相鄰

如何判斷上下兩行國王是否衝突呢?

x&y判斷上下是否衝突

x&(y<<1) 判斷左上右下是否衝突

x&(y>>1) 判斷右上左下是否衝突

#include#define ll long long

using

namespace

std;

ll max,n,m,dp[

20][1005][400],can[5000],num[5000

],tot,ans;

ll getsum(ll x)

intmain()

for(ll i=2;i<=n;i++)}}

for(ll i=1;i<=tot;i++) ans+=dp[n][i][m];

printf(

"%lld\n

",ans);

return0;

}

P1896 SCOI2005 互不侵犯

p1896 scoi2005 互不侵犯 資料不大,時間複雜度很高也差不多能過。使用狀壓dp dp i j k 表示到第i行,狀態為j,選了k個人 然後就是轉移,轉移的難點就是快速判斷 判斷的話,我們整體考慮。然後乙個狀態是否有相鄰的國王。用它本身按位與它本身右移 左移 若結果為0,則說明無相鄰的國王...

P1896 SCOI2005 互不侵犯

首先,養成乙個思路 資料這麼小?狀壓dp!然後翻題解可以這麼定義狀態 定義 dp i j k 為前 i 行中,第 i 行狀態為 j 前 i 行已放置 k 個國王的方案數。顯然一行的狀態只與前一行的有關,所以只需要記錄一行的狀態。但是一行的狀態好像很難存啊!難道複製乙個陣列進去嗎?其實,對於每乙個點,...

P1896 SCOI2005 互不侵犯

在n n的棋盤裡面放k個國王,使他們互不攻擊,共有多少種擺放方案。國王能攻擊到它上下左右,以及左上左下右上右下八個方向上附近的各乙個格仔,共8個格仔。注 資料有加強 2018 4 25 只有一行,包含兩個數n,k 1 n 9,0 k n n 所得的方案數 輸入樣例 1 複製3 2 輸出樣例 1 複製...