動態規劃 狀態壓縮dp

2022-07-05 22:21:10 字數 2590 閱讀 7905

}if (cnt & 1) return false; // 用來判斷像01這種最後是0的情況

return true;

}int main()

return 0;

}/**

* 預處理所有狀態是否為合法狀態

*/#include #include #include using namespace std;

typedef long long ll;

const int n = 12, m = 1 << n; // 列需要從0到11

int n, m;

ll f[n][m];

bool st[m]; // st[i]:狀態i是否為合法狀態

int main()

cnt = 0;

}else ++ cnt;

if (cnt & 1) st[i] = false;

}memset(f, 0, sizeof f);

f[0][0] = 1; // 從第-1列伸出到第0列只有狀態為0表示不伸出是有意義的且表示一種狀態數值為1,其餘狀態不存在均為0

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

for (int j = 0; j < 1 << n; ++ j) // 所有狀態

for (int k = 0; k < 1 << n; ++ k) // 所有狀態

if ((j & k) == 0 && st[j | k])

f[i][j] += f[i - 1][k];

cout << f[m][0] << endl;

}return 0;

}/**

* 進一步優化:選定j時k的合法情況是固定的幾種,在i次遍歷中每次k都進行了一些無效遍歷,

* 優化方法為預處理出和j對應的所有合法情況

*/#include #include #include #include using namespace std;

typedef long long ll;

const int n = 12, m = 1 << n; // 列需要從0到11

int n, m;

ll f[n][m];

bool st[m]; // st[i]:狀態i是否為合法狀態

vectorstate[m]; // state[i]:與狀態i對應的合法狀態

int main()

cnt = 0;

}else ++ cnt;

if (cnt & 1) st[i] = false;

}// 預處理出和j對應的合法k

for (int j = 0; j < 1 << n; ++ j)

memset(f, 0, sizeof f);

f[0][0] = 1; // 從第-1列伸出到第0列只有狀態為0表示不伸出是有意義的且表示一種狀態數值為1,其餘狀態不存在均為0

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

for (int j = 0; j < 1 << n; ++ j) // 所有狀態

for (int k : state[j])

f[i][j] += f[i - 1][k];

cout << f[m][0] << endl;

}return 0;

}

給定一張 n 個點的帶權無向圖,點從 0~n-1 標號,求起點 0 到終點 n-1 的最短hamilton路徑。 hamilton路徑(哈密頓路徑)的定義是從 0 到 n-1 不重不漏地經過每個點恰好一次。

狀態表示:\(f[i][j]\) 表示所有「經過的點集是\(i\),最後位於點\(j\)的路線」的長度的最小值(i包含現在已經走過的所有點,包含j點)

狀態計算一般對應集合劃分。這裡可以將\(f[i][j]\)所表示的集合中的所有路線,按倒數第二個點分成若干類,其中第\(k\)類是指倒數第二個點是\(k\)的所有路線。從\(0\)走到\(j\)的最短路徑等於從\(0\)走到\(k\)的最短路徑+從\(k\)走到\(j\)的路徑,從\(0\)走到\(k\)走過的點相較於從\(0\)走到\(j\)而言,少了\(j\)點,所以經過的點為\(i\)減去乙個\(j\)點,即\(f[i][j] = min(f[i - \][k] + w[k][j])\)

int f[m][n]; // 注意第一維是狀態,數量不再是n了

int main()

動態規劃 dp狀態的壓縮

1312.讓字串成為回文串的最少插入次數 給你乙個字串 s 每一次操作你都可以在字串的任意位置插入任意字元。請你返回讓 s 成為回文串的 最少操作次數 回文串 是正讀和反讀都相同的字串。示例 1 輸入 s zzazz 輸出 0 解釋 字串 zzazz 已經是回文串了,所以不需要做任何插入操作。示例 ...

狀態壓縮動態規劃(狀壓DP)

狀態壓縮動態規劃就是我們常說的狀壓dp,前兩天某廠實習生二面面試官隨手就給我抽了一道狀壓dp的題,我根本沒思路,sorry就寫了一行注釋。然後leetcode周賽最後一題又碰到了狀壓dp的題目,我一定要搞定這個型別的問題。加油加油 狀壓dp說簡單也簡單,基本上就是用一串二進位制樹來表示當前情況 的狀...

任務安排 動態規劃dp 狀態壓縮

馬上假期就要結束了,zjm還有 n 個作業,完成某個作業需要一定的時間,而且每個作業有乙個截止時間,若超過截止時間,一天就要扣一分。zjm想知道如何安排做作業,使得扣的分數最少。tips 如果開始做某個作業,就必須把這個作業做完了,才能做下乙個作業。有多組測試資料。第一行乙個整數表示測試資料的組數 ...