動態規劃 方格取數(hdu1565)

2021-07-24 18:28:07 字數 707 閱讀 8374

題目描述:

給你乙個n*n的格仔的棋盤,每個格仔裡面有乙個非負數。

從中取出若干個數,使得任意的兩個數所在的格仔沒有公共邊,就是說所取的數所在的2個格仔不能相鄰,並且取出的數的和最大

解題思路:

很顯然又是dp問題,我們可以把方格當成乙個矩陣,每個數都是取或不去狀態,這裡為了方便,我們以01來表示他們的取捨情況,這樣每一行就可以用乙個數來表示,

而他的二進位制就是我們取捨的狀態(我看網上大神都是這麼幹的,吊吊的有木有)

因為取的數所在的2個格仔不能相鄰,所以每一行的二進位制數不能有相鄰的1,再來看列,相鄰的兩行不能有相鄰的,對於兩個二進位制,也就是兩個數相與(&)為0,

這樣就可以得到狀態轉移方程:dp[i][j]=max(dp[i][j],dp[i-1][k]+s)

#include #include int max(int a,int b)

int main()

for(i=1;i<=n;i++)

for(j=0;j>j)&1)

if(j+1>(j+1))&1))}}

if(x) b[t++]=i;

} printf("%d\n",i);

for(i=0;i>j)&1)

s+=a[1][j];

}dp[1][i]=s;

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

dp[i][j]=s;

for(k=0;k

HDU 1565 方格取數

第一道狀態壓縮dp,比較簡單,做得也比較暴力,不過還挺適合入門,貼個 紀念一下 include include include include include define pub push back define ll int64 using namespace std const int n 2...

HDU1565方格取數

典型的狀態壓縮dp問題。第i行的取法只受到第i 1行的影響。首先每一行的取法要相容 不能有兩個相鄰 然後相鄰行之間也要相容。將每乙個格仔看做兩種狀態,1表示取,0表示不取。這樣每一行就是乙個01串,恰好可以看做是乙個二進位制數,那麼該二進位制數對應的十進位制整數可以唯一的表示為當前第 i 行的狀態。...

HDU 1565 方格取數 1

hdu 1565 方格取數 1 我的第乙個狀態壓縮dp 給你乙個n n的格仔的棋盤,每個格仔裡面有乙個非負數,從中取出若干個數,使得任意的兩個數所在的格仔沒有公共邊,就是說所取的數所在的2個格仔不能相鄰,並且取出的數的和最大 3 75 15 21 75 15 28 34 70 5 188對於每乙個數...