Hdu 1501(記憶化搜尋,dp)

2021-09-19 16:21:12 字數 930 閱讀 7417

hdu-1501

思路:(1)記憶化搜尋

找字串是否匹配,只需要找到字串的對應順序一致即可。

資料不大,所以可以開乙個二維陣列記錄s1,s2連個字串中字元出現的位置,然後與結果串進行匹配。

#include#include#includeusing namespace std;

const int maxn = 505;

char s1[maxn],s2[maxn],ss[maxn];

int dp[maxn][maxn],l1,l2,len,pos;

void dfs(int x,int y,int z)

if(dp[x][y]||pos==1) return ;

if(!(s1[x]==ss[z]||s2[y]==ss[z])) return ;

dp[x][y] = 1;

if(s1[x]==ss[z]) dfs(x+1,y,z+1);

if(s2[y]==ss[z]) dfs(x,y+1,z+1);

}int main(void)

return 0;

}

(2)dp

#include#include#includeusing namespace std;

const int maxn = 505;

int dp[maxn][maxn],l1,l2,len;

char s1[maxn],s2[maxn],ss[maxn];

int main(void)

}printf("data set %d: ",pt++);

if(dp[l1][l2]) printf("yes\n");

else printf("no\n");

}return 0;

}

參考文章

HDU1501 Zipper(DFS 記憶化搜尋)

題意 給三個字串,保證第三個串長度是前兩個串長度之和,確定前兩個串保持原有的字母順序能不能拼成第三個串。思路 直接搜尋的話會有大量重複的運算,要用記憶化陣列記錄之前的結果。當匹配到第乙個串的第i位和第二個串的第j位時,前面可能有多種情況,但三個串後面的長度一定,所以結果也可以確定,用vis i j ...

hdu 1069 記憶化搜尋 dp

題目鏈結 題意 有n種長方體,每個都有無數個,分別告訴你它們的長寬高,問最多能疊多高,要求是上面的長方體的地面積的長和寬都要比下面的長方體的小,長方體可以旋轉,就是說放的時候可以以任意一面作為底面積。思路 用a i j 來記錄第i種長方體的第j條邊的高,用dp i j 表示以第i個長方體為底且以第j...

hdu 1078 (dp記憶化搜尋)

題意 有乙個n n的方格,每個格仔有乙個價值,經過這個格仔就可以得到這個價值,每次可以橫著或者豎著一步最多走k格,並且每次走的格仔要比上乙個格仔的價值大,問現在從位置 1,1 走,最大可以獲得的價值.分析 記憶化搜素,dp i j 表示的是從位置 i,j 開始走可以獲得的最大價值。記錄下這些價值就可...