這題可以用最大流做,為了練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...