HDU1565方格取數

2022-05-12 22:37:54 字數 1165 閱讀 9152

典型的狀態壓縮dp問題。第i行的取法只受到第i-1行的影響。首先每一行的取法要相容(不能有兩個相鄰),然後相鄰行之間也要相容。將每乙個格仔看做兩種狀態,1表示取,0表示不取。這樣每一行就是乙個01串,恰好可以看做是乙個二進位制數,那麼該二進位制數對應的十進位制整數可以唯一的表示為當前第 i 行的狀態。定義用dp[i][j]表示前 i 行狀態為j 時最大和。其中狀態 j對應的整數為stu[j],陣列stu收錄的是所有合法的狀態,所謂合法狀態是:若乙個整數的二進位制中沒有任意兩個1相鄰,那麼該整數就是合法的狀態。判定方法:若 x&(x<<1)==0,則x是合法的狀態。狀態轉移方程如下:

dp[i][j]=max+value[i][j] (w&j==0) ;

方程含義:j是第i行狀態,w是第i-1行的狀態,value[i][j]是第i行狀態為j時第i行取法的和。從w狀態轉移到j狀態需要滿足w&j==0(他們是相容的)。計算時候需要列舉第i行所有狀態w。**如下:

#define _crt_secure_no_deprecate#include

using

namespace

std;

#define max_size 17712 //

當n=20時可以計算得到最多有11710中狀態

int stu[max_size], value[max_size]; //

stu表示總的狀態數,max_size表示對應狀態的值

int a[22][22], dp[22

][max_size];

int initialization(int

n);int stuvalue(int i, int

j);int

main()

dp[i][j] = lmax + stuvalue(i, j); //

計算狀態dp[i][j]

if (maxsum maxsum =dp[i][j];

}printf(

"%d\n

", maxsum);

}return0;

}int initialization(int

n)

return

ant;

}int stuvalue(int i, int j)

return

sum;

}

HDU 1565 方格取數

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

HDU 1565 方格取數 1

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

HDU1565 方格取數 1

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