題目: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 #include2 #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 再進行動態更新,用上...