hdu 1565 狀態壓縮DP

2022-08-17 23:48:13 字數 1006 閱讀 8810

這題可以用最大流做,為了練dp就用狀態壓縮了。我一開始只想到乙個o(n*2^n*2^n)的方法,效率太低,看了某大牛的解題報告後,才將演算法優化到o(n^2*2^n)。

不過就這樣還wa了好幾次,原因是**中一句

if ((k & t) == 0)我開始寫成了if (k & t == 0)

沒有注意到位運算子的優先順序是低於邏輯運算子的,謹記謹記!

/*

* hdu1565/win.cpp

* created on: 2011-10-4

* author : ben

*/#include

#include

#include

#include

#include

#include

#include

using

namespace std;

const

int maxn = 22;

const

int max_state = 1

<< 20 + 1;

int map[maxn][maxn];/**

* 用了滾動陣列,否則應為dp[maxn][maxn][max_state]

* 從上到下,從左到右填,dp[i][j][k]表示填到第i行第j列狀態為k時的最大值

*/int dp[2][max_state];

int n, state;

int work() else

if (j > 0 && (k & (t >> 1))) else }}

}ans = -1;

p = (n * n) % 2;

for (int k = 0; k < state; k++)

}return ans;

}int main()

}printf("

%d\n

", work());

}return

0;}

hdu1565 網路流或狀態壓縮DP

對於網路流有乙個定理 最小點權覆蓋集 最大網路流 最大點權獨立集 總權值 最小點權覆蓋集 網路流解法 如下 include include include include define n 1010 define m 50010 define inf 1 30 using namespace std...

hdu1565 dp狀態壓縮

題意 給你乙個n n的格仔的棋盤,每個格仔裡面有乙個非負數。從中取出若干個數,使得任意的兩個數所在的格仔沒有公共邊,就是說所取的數所在的2個格仔不能相鄰,並且取出的數的和最大。解題思路 先找出所有能成立的狀態,即 i i 1 0,表示每一行都沒有相鄰的,然後遍歷if q j 1 再進行動態更新,用上...

hdu 1565 方格取數 1 狀態壓縮 dp

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