狀態壓縮 方格取數

2021-08-13 03:01:07 字數 1874 閱讀 5345

標籤: acm

題目:

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

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

input

包括多個測試例項,每個測試例項包括乙個整數n 和n*n個非負數(n<=20)

output

對於每個測試例項,輸出可能取得的最大的和

sample input

3

75 15 21

75 15 28

34 70 5

sample output

需要用到異或,感覺在狀態壓縮裡面特別重要

按位與運算將兩個運算分量的對應位按位遵照以下規則進行計算:

0 & 0 = 0, 0 & 1 = 0, 1 & 0 = 0, 1 & 1 = 1。
即同為 1 的位,結果為 1,否則結果為 0。

例如,設3的內部表示為011

5的內部表示為101

3&5的結果為001

按位或運算將兩個運算分量的對應位按位遵照以下規則進行計算:

0 | 0 = 0, 0 | 1 = 1, 1 | 0 = 1, 1 | 1 = 1
即只要有1個是1的位,結果為1,否則為0。

按位異或運算將兩個運算分量的對應位按位遵照以下規則進行計算:

0 ^ 0 = 0, 0 ^ 1 = 1, 1 ^ 0 = 1, 1 ^ 1 = 0
即相應位的值相同的,結果為 0,不相同的結果為 1。

例如,013^035結果為026

異或運算的意思是求兩個運算分量相應位值是否相異,相異的為1,相同的為0。按位異或運算的典型用法是求乙個位串資訊的某幾位資訊的反。如欲求整型變數j的最右4位資訊的反,用邏輯異或運算017^j,就能求得j最右4位的資訊的反,即原來為1的位,結果是0,原來為0的位,結果是1。

#include 

#include

#define m 17720 //每一行有最大17711種狀態

#define n 21

using

namespace

std;

intmap[n][n]; //儲存輸入的數字

int sum[n][m]; //第i行第j種狀態的總和

int state[m];

int dp[n][m];

int n,p;

int max(int a,int b) // 求最大值

bool checkline(int i) //檢查該狀態是否符合題意

bool checktwoline(int i,int j) //檢查該行與上一行是否符合題意

void init()

void solve()

int ans=dp[n-1][0];

for(i=1;iif(ans1][i])

ans=dp[n-1][i];

}cout

return

0;}

方格取數 1 (狀態dp)

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

HDU 1565 方格取數 1 狀態壓縮)

沒什麼好說的,主要看 注釋,取數,某個位置能放東西,某個位置不能放等等,這類寫法基本都是這樣 problem description 給你乙個n n的格仔的棋盤,每個格仔裡面有乙個非負數。從中取出若干個數,使得任意的兩個數所在的格仔沒有公共邊,就是說所取的數所在的2個格仔不能相鄰,並且取出的數的和最...

hdu2167 方格取數 狀態壓縮dp

題意 方格取數,八個方向的限制。思路 八個方向的不能用最大流了,四個的可以,八個的不能抽象成二分圖,所以目測只能用dp來跑,dp i j 表示的是第i行j狀態的最優,具體看 include include int dp 16 1 15 int map 16 16 int zt 1 15 int ma...