HDU 4026 狀態壓縮DP 判斷路徑可達

2022-08-23 17:51:07 字數 1873 閱讀 4177

題目:unlock the cell phone

題意:玩過android吧,有個叫圖案屏鎖的。這題求連線所有的點能產生的圖案鎖的個數。輸入n,m表示圖案為n*m的規模(n,m<=5),然後輸入乙個n*m的矩陣g,g[i][j]表示該點的型別,為0時表示普通的點能觸點能滑動,但不能跨,為1時這個點不能被點選和滑過,為2時表示這點能跨過但不能觸點。求連線所有的普通點能構成多少個圖。 p="">

解題思路:

網路賽時沒看過這題,如果看了相信會花乙個下午的時間鑽在這題上,狀態壓縮dp是我最想征服的型別。這跟哈密頓圖的解法差不多,其實就是求哈密頓通路個數吧。dp[i][s],表示以結點i為最後乙個連線點路徑狀態為s時的影象個數。轉移式為dp[i][s] = dp[1][s ^ (1 << i)] + dp[2][s ^ (1 << i)] + ...dp[n][s ^ (1 << i)]。最後所有的dp[k][(1 << n + 1) - 1]求和為解。在判定i,j兩點是否可達時應預先處理,否則很容易tle。另外'&'這運算子的級別超低,最好每個表示式都加括號。

view code

1 #include 

2 #include

3 #include

4 #include

5 #include

6 #include

7 #include

8 #include 910

using

namespace std;

1112

const

int max = 30;

13int n, m;

14int g[max];

15int shash[max];

16int nhash[max];

17int d[max][max];

18int s[max][max];

19long

long dp[17][1

<< 17];

2021

bool isinline(int x1, int y1, int x2, int y2, int x3, int y3)

22 25

26void exchange(int& a, int& b)

27 32

33void build(int e)

34 60

if(g[k] == 0)

61

65 }

66 }

67 }

68 }

69 }

70bool canreach(int i, int j, int s)

71 78

79int main()

80 94 }

95 build(e);

96int end = 1

<< e;

97for(s = 1; s < end; ++s)

98

115 }

116 }

117 }

118 }

119 }

120long

long ans = 0;

121for(i = 0; i < e; ++i)

122

125 printf("

%i64d\n

", ans);

126 }

127return

0;128 }

Hdu 3811 狀態壓縮 DP

題意 給定數n n 17 求乙個n位數,每位可選1 n中的乙個,且每位不同,並且滿足給定的條件,求方案數。給定條件為m個 x y 表示第x位為y的滿足要求。滿足m中的乙個條件即正確。演算法 dp 狀態壓縮 分析 首先不考慮條件的總方案數為n 我們先算不滿足條件的方案,因為m個條件之間是或者 關係,有...

hdu 1074 狀態壓縮dp

題目描述 有 n 門課程的作業,每門都有完成期限d,與完成所需時間c,若超過期限,1天扣1分。問完成這n門作業至少要扣多少分,並輸出扣分最少的做作業順序。思路 dp i 記錄完成狀態為i的情況下的資訊。完成所需時間,上乙個狀態,最小扣分 狀態方程 dp i min dp j cost j,i 從j狀...

hdu1565 dp狀態壓縮

題意 給你乙個n n的格仔的棋盤,每個格仔裡面有乙個非負數。從中取出若干個數,使得任意的兩個數所在的格仔沒有公共邊,就是說所取的數所在的2個格仔不能相鄰,並且取出的數的和最大。解題思路 先找出所有能成立的狀態,即 i i 1 0,表示每一行都沒有相鄰的,然後遍歷if q j 1 再進行動態更新,用上...