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#includeview code#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;
}
沒有滾動陣列的**
//狀態轉移的一種方法是根據乙個序列的結尾入手找出規律
#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...