什麼是插頭dp?
首先我們要先知道它能解決那些問題。一般都是一張方格圖里有關連通性的一些問題。
那麼對於乙個格仔而言,他就可能會有一些線經過它。(所以也可以沒有,看題目)
例如這張圖
那麼插頭就是描述這些線條如何穿過這些格仔
那如何用插頭來表示一種狀態?
對於乙個寬度為m的圖,它的插頭就有m+1種,每一種插頭的01狀態代表這個位置有沒有插頭。
那麼狀態如何轉移呢?
就這麼幾種狀態,可以分類討論或者適當簡化一下。
一行之尾與下一行之首間的轉化
初始化的時候就是-1行state為0時才為1
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
#define clr(a, x) memset(a, x, sizeof(a))
#define mp(x, y) make_pair(x, y)
#define pb(x) push_back(x)
#define x first
#define y second
#define fastin \
ios_base::sync_with_stdio(0); \
cin.tie(0);
typedef
long
long ll;
typedef pair pii;
typedef
vector
vi;int g[15][15];
ll dp[2][(1
<<12)+10];
int n,m;
int main()
else }}
cur^=1;
clr(dp[cur],0);
for(int st=0;st
<1)] += dp[cur^1][st];
}printf("case %d: there are %lld ways to eat the trees.\n",++cas,dp[cur][0]);
}return
0;}
hdu1693插頭DP求多迴路
剛學習了插頭dp,找了道基礎題練練手。用乙個n 1位的二進位制數表示輪廓線上的狀態,1代表有插頭,0代表沒有插頭。那麼狀態的轉移為 如果當前格的兩個輪廓線上只有乙個插頭,那麼dp i j k dp i j 1 k dp i j 1 k x y 否則dp i j k dp i j 1 k x y 如下...
插頭DP 入門
強烈推薦 hdu 1693 eat the trees 多迴路的不用判聯通狀態,二進位制即可,轉移情況2 2種。時間o n m 2 n 空間o n 2 n 插頭dp include include const int maxm 13 const int maxn 1 12 typedef long ...
HDU 1565 方格取數 1 插頭dp
problem description 給你乙個n n的格仔的棋盤,每個格仔裡面有乙個非負數。從中取出若干個數,使得任意的兩個數所在的格仔沒有公共邊,就是說所取的數所在的2個格仔不能相鄰,並且取出的數的和最大。input 包括多個測試例項,每個測試例項包括乙個整數n 和n n個非負數 n 20 ou...