插頭DP 入門

2021-05-28 11:45:32 字數 1667 閱讀 6744

強烈推薦**:

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 long ll ;

ll dp[maxm][maxn];

int map[maxm][maxm];

/*i行j列 輪廓線狀態k。除了換行以外,每個狀態只與同行的狀態的前一列有關,可以減少一維空間

*/int main ()

for (int j=1 ; j<=m ; ++j)

t^=1;

}for (int j=1 ; j<=m ; ++j,t^=1)

;// dir[0-up 1-right 2-down 3-left];

int dp[2][45108864+123];//00 - f , 01 - c , 10 - r , 11 is redundancy

char map_[13][13][5];

int t; //滾動用

void init()//put ternary in quaternary

}inline int change(char ch)

int r,c;

void dfs(int col, int sta, int uni)//

for (int i = 0; i < 4; ++i)

}int cuts;

void dp()}}

else}}

}}

}int main ()

printf("case %d: %d\n",i,ans);

}return 0;

}

ac**(雜湊):

#include #include typedef int types;

using namespace std;

const int limithash=100007;

const int mod=1000000007;

int dir[4][4]=;

int r, c, map[5];

int cuts;

int t;

struct hashmap

pos++;

if(pos==limithash)pos=0;

} total++;//從1開始

hash[pos]=total;//此處新增新狀態

state[total]=s;

sum[total]=data;

} void clear ()

}dp[2];

inline void roll ()

inline bool valid(int x, int y)

char str[10];

int main ()}}

} int ans=0;

for (int i=1 ; i<=dp[t].total ; ++i)

printf("case %d: %d\n", i, ans);

} return 0;

}

插頭Dp總結

題目大意 給出n m的方格,有些格仔不能鋪線,其它格仔必須鋪,可以形成多個閉合迴路。問有多少種鋪法?插頭dp板子題,題目要求可以是多個迴路,只需要兩個狀態,代表是否有插頭即可 plug 1 plug 2 0 0 新建乙個插頭插向兩邊 0 1 轉 不轉彎 1 0 同上 1 1 合併插頭 題目大意 乙個...

總結 插頭 dp

集中做完了插頭 dp 寫一下題解。一開始學的時候還是挺矇的。不過後來站在輪廓線 dp 的角度上來看就簡單多了。其實就是一種聯通性 dp 只不過情況比較多而已了。本來轉移方式有兩種。逐行和逐格轉移。不過逐行轉移因為分類太多所以被捨棄了。一般的插頭 dp 採用逐格轉移。插頭表示已經進入當前格仔的狀態,而...

插頭DP總結

從跳樓到蒙b。插頭dp,電源插頭dp,工業插頭dp,插座dp。額我們先將一些技能的,比如說hash表,這年頭連hash表都不會打,簡直就是yasi。hash使用乙個表頭加鍊表的結構實現陣列的使用。比如說要統計值域到1e9的一列數出現次數,顯然我們就把一列數壓一下,比如模乙個質數同餘的放在一起,然後把...