強烈推薦**:
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的一列數出現次數,顯然我們就把一列數壓一下,比如模乙個質數同餘的放在一起,然後把...