一道最長公共子串行變形的題目。
關於那個**,沒想到很好的處理方式,直接打表了。
最長公共子串行的狀態轉移方程:
if(a[i]==b[i]) dp[i][j]=dp[i-1][j-1]+1;
else dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
這道題需要做一下變形:
s1取字母,s2取字母:dp[i-1][j-1]+f[s1[i]][s2[j]]
s1取'-',s2取字母:dp[i][j-1]+f['-'][s2[j]]
s1取字母,s2取'-':dp[i-1][j]+f[s1[i]]['-']
dp[i][j]等於三者的最大值。
在求解之前,需要初始化:
dp[0][0]=0;
dp[i][0]=dp[i-1][0]+f[s1[i]]['-'];
dp[0][j]=dp[0][j-1]+f['-'][s2[j]];
#include#include#includeusing namespace std;
const int inf=0x3f3f3f3f;
const int maxn=105;
int t,n,m;
char s1[maxn],s2[maxn];
int dp[maxn][maxn],f[maxn][maxn];
void work()
void initdata()
int main()
}printf("%d\n",dp[n][m]);
}return 0;
}
poj 最長公共子串行和最長公共子串
最長公共子串行 poj1458 問題描述 給出兩個字串,求出這樣的乙個最長的公共子串行的長度 子串行中的每個字元都能在兩個原串中找到,而且每個字元的先後順序和原串中的先後順序一致。sample input abcfbc abfcab programming contest abcd mnp samp...
hdu1080 最長公共子串行變形
給定乙個相似性矩陣 給定兩個基因序列 由agct組成 填充空格 使得相似性分數最高 狀態轉移,其中dp i,j 表示s1 i 和s2 j 處能取到的最大分數 i 1,2,3.len1,j 1,2,3,len2 dp i,j max max dp i 1,j 1 table i,j dp i,j 1 ...
最長公共子串行 最長公共子串
1 最長公共子串行 採用動態規劃的思想,用乙個陣列dp i j 記錄a字串中i 1位置到b字串中j 1位置的最長公共子串行,若a i 1 b j 1 那麼dp i j dp i 1 j 1 1,若不相同,那麼dp i j 就是dp i 1 j 和dp i j 1 中的較大者。class lcs el...