這個題的意思是第一行給出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的時候需要記憶化...