求兩個字串的最長公共子串行時,需要用到兩個陣列c[maxlen][maxlen],b[maxlen]maxlen],c[maxlen][maxlen]
用於記錄兩個字串的lcs(最長公共子串行)的長度,b[maxlen]maxlen]記錄回溯時搜尋方向,1表示上方,-1表示左方,0表示左上方。
動態轉移方程:
b[i][j]的方向與c[i][j]具體取哪個的值相同,例如c[i,j]=c[i,j-1],則b[i][j]=-1左方*/
#include
#include
#include
#define maxlen 1010
using namespace std;
/*求兩個字串的最長公共子串行時,需要用到兩個陣列c[maxlen][maxlen],b[maxlen]maxlen],c[maxlen][maxlen]
用於記錄兩個字串的lcs(最長公共子串行)的長度,b[maxlen]maxlen]記錄回溯時搜尋方向,1表示上方,-1表示左方,0表示左上方。
動態轉移方程:
char x[maxlen],y[maxlen];
int b[maxlen][maxlen],c[maxlen][maxlen];
void lcs(char *x,char *y,int m,int n,int b[maxlen][maxlen],int c[maxlen][maxlen])
else if(c[i-1][j]>=c[i][j-1])
else}}
}void printlcs(int b[maxlen][maxlen],char *x,int i,int j)
else if(b[i][j]==1)
printlcs(b,x,i-1,j);
else
printlcs(b,x,i,j-1);
}int main()
return 0;}
2、求長度
動態轉移方程 dp[x][y]=max
#include
#include
int dp[1010][1010];
int main()
else if(dp[i-1][j]>=dp[i][j-1])
dp[i][j]=dp[i-1][j];
else
dp[i][j]=dp[i][j-1];
}printf("%d\n",dp[lx][ly]); }
}
求最長公共子串行長度
1.求最長公共子串行 子串行可以不連續 這是一道動態規劃題,設二維陣列dp i j dp i j 表示a串前i個字元 包括第i個 與b串前j個字元 包括第j個 所有的公共子串行的最長長度。例如,a串abbcd,b串abcd,dp 3 3 就表示的a的前三個字元與b的前三個字元的最長公共子串行長度,值...
SDUT 最長公共子串行長度 動態規劃
time limit 1000 ms memory limit 65536 kib submit statistic problem description 給定兩個序列x input 輸入資料有多組,每組有兩行 每行為乙個長度不超過500的字串 輸入全是大寫英文本母 a,z 表示序列x和y。out...
最長公共子串行長度以及列印(動態規劃入門)
poj1458原題鏈結 北大郭煒老師在mooc上講的 演算法基礎的例題 也是按照講的寫的 方法呢就是 串 a 以 i 為結尾和串 b 以 j 為結尾的最長公共子串行長度 maxlen i j max maxlen i j 1 maxlen i 1 j 當a的第i 1字元個和b的第j 1個字元一樣時 ...