狀壓DP實現順序列舉 POJ 2817

2021-08-19 08:35:22 字數 2041 閱讀 2767

poj 2817

有n個字串,可以以任何一種順序排列,每相鄰兩個字串之間的最長公共子串長度為這兩個之間的分數,在每個字串的前面可以新增任意數量的空格,那麼請問最大得到分數是多少?

首先我們看到乙個關鍵字:相鄰字串之間最長公共子串,那麼這裡就避免不了求解這個東西,我們發現這裡n的範圍(1 <= n <= 10),並且字串的長度也不會超過10,那麼我們直接列舉來求解這個長度就好,時間複雜度為o(n^3),然後我們發現這個問題就變成了怎麼排列n個字串能使得到的分數最大,首先我們第乙個想到的一定是全排列列舉每一種狀態計算,這裡我們就要用到生成全排列的函式next_permutation()來求解,但是我門還可以使用狀壓dp來實現這個功能

dp[i][j]:當前狀態為i時,最後乙個選取的字串為j時的最優解

len[i][j]:字串i與字串j的最長公共子串行

實現過程:模擬一下這個過程

我們現在現在的狀態中找到乙個已經存在的1,假設這個1就是最後加入的字串,然後我們再從裡面找到乙個狀態為0(沒有加入的字串)的字串,將這個狀態為0的放到這個最後加入的字串後面(上面找到狀態為1的字串),最終我門就可以得到最終的答案

資料:

3

abcbcd

cde

我們得到len[i][j]陣列,表示i與j之間最大的公共長度:len[1][2] = 2 ; len[2][3] = 2 ; len[1][3] = 1;

狀態狀態轉移

000無

001dp[3][2] = len[1][2] = 2,dp[5][3] = len[1][3] = 1

010dp[3][1] = len[2][1] = 2,  dp[6][3] = len[2][3] = 2

011dp[7][3] = dp[3][1] + len[1][3] = 3,dp[7][3] = dp[3][2] + len[2][3] = 4 

100dp[5][1] = len[3][1] = 1 , dp[6][2] = len[3][2] = 2

101dp[7][2] = dp[5][1]+len[1][2] = 3 , dp[7][2] = dp[5][3] + len[3][2] = 3 

110dp[7][1] = dp[6][2] + len[2][1] = 4, dp[7][3] = dp[6][3] + len[3][1] = 3

111無

從上面的狀態轉移看一看到也就是我們假設每一次第乙個找到的1為最後乙個當前順序中的最後乙個,那麼我們再去尋找乙個0,將這個狀態放到當前1的後面,用前面的狀態實現了當前狀態的計算

#include #include #include #include #define inf 0x3f3f3f3f

using namespace std;

const int n = 11;

int n;

char str[n][n];

int len[n][n];

int dp[1<

d. kefa and dishes

這個題裡面和上面的題很是類似,只不過這個裡面每乙個都會有乙個初始的數值,所以我們的dp陣列就會有一步初始化的過程,並且我們這個裡面不光是n個中挑選m個來進行求解最大值,所以當我們列舉的狀態個數為m個的時候我們就要更新最大的數值,我們為什麼不能只更新到m呢?因為我們這裡更新的順序不是從小到大的順序,所以後面還會有大小為m的時候,我們這裡要說明一點:雖然我們列舉的狀態裡面比如100100這個狀態他的3,6不是連在一起的,但是我們在程式中他們就是連在一起的,並且記錄了這兩個哪個在前面哪個在後面的

#include #include #include #include #include #include #define ll long long

#define inf 0x3f3f3f3f

using namespace std;

const int n = 19;

ll dp[1<

狀壓dp 玉公尺田 狀壓dp

相關 強相關 327.玉公尺田 狀壓dp 小國王 狀壓dp 是井字形,本題是十字形。思路 狀態計算 時間複雜度 n 2 n 2n o n 22n 12 2 24n 2 n 2 n o n2 12 2 n 2n 2 n o n22n 12 224 看著妥妥超時,但是裡面合法狀態很少 依舊可以過 在此,...

狀壓dp小記

鋪磚 題意 現有nm的一塊地板,需要用12的磚塊去鋪滿,中間不能留有空隙。問這樣方案有多少種 include using namespace std typedef long long ll const int maxn 1 11 int n,m,state ll dp 15 maxn s1表示本行...

狀壓dp學習

p2704 炮兵陣地 1038 裁玻璃 狀壓dp是一種非常暴力的做法,列舉所有可能的狀態,找到要求的最佳狀態,與一般dp不同,前一項與後一項有一些複雜的狀態關係。dp的引數 物品個數 行數等 當前狀態 上乙個狀態 將abc的有無表示成乙個8個狀態,列舉所有組,列舉上乙個狀態,得到當前狀態的最優解 i...