POJ 2817 狀壓DP 記憶化搜尋

2021-06-22 20:01:44 字數 662 閱讀 5653

這個題的意思是第一行給出case數n (1 <= n <= 10),然後給出n個單詞,每個一行,當輸入不是正整數的時候結束。每個單詞最多10個字母。要求的是,按任意順序排列這些單詞,可以在單詞前面加任意個空格,使得相鄰的單詞上下對應的字母數目最多,並輸出最多是多少。

先預處理出每兩個單詞相連所能對應的字母數最多的情況,記錄到match[i][j]中。注意在乙個單詞前面加空格時不能使該單詞長度超過另乙個,wa了一次。

一共最多10個單詞,狀壓儲存狀態,然後記憶化搜尋即可

#include "stdio.h"

#include "string.h"

int n;

char str[20][20];

int match[20][20];

int dp[1<<15][20];

int index[20];

int max(int a,int b)

dp[aim][x]=sum;

return sum;

}int main()

ans=0;

for (i=1;i<=n;i++)

ans=max(ans,dfs(aim,i));

printf("%d\n",ans);

}return 0;

}

狀壓DP實現順序列舉 POJ 2817

poj 2817 有n個字串,可以以任何一種順序排列,每相鄰兩個字串之間的最長公共子串長度為這兩個之間的分數,在每個字串的前面可以新增任意數量的空格,那麼請問最大得到分數是多少?首先我們看到乙個關鍵字 相鄰字串之間最長公共子串,那麼這裡就避免不了求解這個東西,我們發現這裡n的範圍 1 n 10 並且...

poj2817 狀態dp(二進位制儲存) 記憶化搜尋

思想參考的這位的部落格,寫得很詳細,十分感謝她 他 這也是我的第一道狀態dp,是自己敲的,開始的時候,過不了樣例,發現位運算的條件弄錯了,還有num陣列打表弄錯了,改後就1a了。上面的部落格寫得很詳細,只稍微補充一下 補充在 的注釋中了 其它就看這個部落格就行了。乙個單詞有就為1,沒有就為0,於是用...

LightOJ 1057 狀壓dp,記憶化

題目大意 有一張n m的圖,上面有乙個起始點x,和最多15個金子g,每一步你可以走到相鄰的8個格仔,題目要求走完所有的金子並且返回初始點的最小路徑是多少 題目解析 狀態壓縮,定義dp i j 表示在j序列下在第i個金子需要走的最小路徑,如果是已經沒有金子的話就返回到開始點的距離,dp的時候需要記憶化...