HDU 1693 插頭dp 艱難入門

2021-08-26 20:23:22 字數 1462 閱讀 2642

什麼是插頭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...