hdu 1159 最長公共子串 O nm dp演算法

2022-04-10 00:08:50 字數 937 閱讀 6978

i i+1

....b b d

.....a b c

j j+1

假設dp[i][j]為以i,j結尾的最大公共子串

迴圈到i,j時,我們假設dp[i-1][j],dp[i-1][j-1],dp[i][j-1]都已經得出最優解

若i與j不匹配,那麼dp[i][j]=max(dp[i-1][j],dp[i][j-1])

若i與j匹配,那麼dp[i][j]=dp[i-1][j-1]+1,可以看出,即使i-1與j也已經匹配,i與j匹配也仍然不影響最優解的值

先貼個滾動陣列的**:

#include#include

#include

using

namespace

std;

char str1[500],str2[500

];int dp[2][500

];int lcs(char* str1,char* str2)

return dp[len1%2

][len2];

}int

main ()

return0;

}

view code

沒有滾動陣列的**

//

狀態轉移的一種方法是根據乙個序列的結尾入手找出規律

#include

#include

#include

using

namespace

std;

char str1[100],str2[100

];int dp[100][100

];int lcs(char* str1,char* str2)

return

dp[len1][len2];

}int

main ()

return0;

}

hdu 1159 最長公共子串行

2562465 2010 06 29 17 20 23 accepted 1159 31ms 3240k 835 b c t t include include include define max size 10000 using namespace std int dp max size 1 m...

HDU1159最長公共子串行

這個題貌似是演算法導論的原題 不過本著能迴圈堅決不用遞迴的態度 我認真地寫了迴圈 關鍵其實就是乙個轉移方程 如果兩個位元組一樣,他就等於 dp a b dp a 1 b 1 1 如果不一樣就找兩邊最大的 dp a b max dp a b 1 dp a 1 b 另外在dp題裡有點找到感覺了,如果想要...

hdu 1159 公共子串行

用二維陣列f i j 記錄字串s1的前i個字元與s2的前j個字元的最大公共子串。當s1 i s2 j 時,f i j f i 1 j 1 1 否則f i j max f i 1 j f i j 1 include include define max a,b a b?a b define n 100...