方格取數 1 (狀壓dp入門題)

2021-10-04 03:24:25 字數 1059 閱讀 7084

題意:給你n*n的方格中取數,但不能取相鄰的數,(上下左右相鄰都不行),求可以取的數之和的最大值。

思路:一道狀壓dp入門題,因為給的n並不大,我們用乙個n位二進位制數來表示這一行的n個數取與不取的狀態,因為一行之間相鄰的不能取,所有我們可以把不符合的數全部篩選除去(i&i>>1)=0就是符合要求的數,不然就是不符合要求的數,原因很簡單,我們把i右移一位之後再與原來的數&一下,如果有相鄰的1存在,那麼i右移一位之後就會1的位置就會對齊,那麼&之後就肯定不會是0,刪一我們可以用這種方法篩選出符合要求的數,行與行之間,也是一樣的道理,假設第i行狀態為j,第i-1行狀態為k,那麼如果符合要求,那麼i&j=0,最後我們找出最大值的就可以了。

#include

#include

#include

#include

#include

using

namespace std;

int dp[25]

[20000];

int tot[

20000];

int a[25]

[25];

intfin

(int i,

int x)

x/=2

; t++;}

return sum;

}int

main()

}int cut=0;

for(

int i=

0; i

<

; i++)}

for(

int i=

1; i<=n; i++)}

}int ma=0;

for(

int i=

1; i<=cut; i++

)printf

("%d\n"

,ma);}

return0;

}

狀壓dp 方格取數 1

題目位址 題目大意 給你乙個n n的格仔的棋盤,每個格仔裡面有乙個非負數。從中取出若干個數,使得任意的兩個數所在的格仔沒有公共邊,就是說所取的數所在的2個格仔不能相鄰,並且取出的數的和最大。思路 zh這個題是好久以前看過題解,當時感覺挺困難的,就沒做,這兩天才做的,對於現在來說也不算是難題了,不過是...

HDU 1565 方格取數 1 (狀壓DP)

problem description 給你乙個n n的格仔的棋盤,每個格仔裡面有乙個非負數。從中取出若干個數,使得任意的兩個數所在的格仔沒有公共邊,就是說所取的數所在的2個格仔不能相鄰,並且取出的數的和最大。input 包括多個測試例項,每個測試例項包括乙個整數n 和n n個非負數 n 20 ou...

HDU 1565 方格取數 1 狀壓DP

description 給你乙個n n的格仔的棋盤,每個格仔裡面有乙個非負數。從中取出若干個數,使得任意的兩個數所在的格仔沒有公共邊,就是說所取的數所在的2個格仔不能相鄰,並且取出的數的和最大。input 包括多個測試例項,每個測試例項包括乙個整數n 和n n個非負數 n 20 output 對於每...