題目演算法:動態規劃;可參考:https:
狀態轉移方程:
設輸入的兩個字串為s1和s2,那麼用來儲存他們最長公共自序列的長度,則:
if(s1[i-1]==s2[j-1]) sum[i][j]=sum[i-1][j-1]+1; // 狀態轉移方程
else sum[i][j]=max(sum[i-1][j],sum[i][j-1]);
關於本題狀態轉移方程的解釋:
請參考:https:
下面放上ac**:
//peking university online judge 1458
//algorithm: lcs
#include#include#define max 1000
int max(int,int); //求最大值
void maxsum(int,int); //求最大的和
void initzero(int,int);//將sum中的數全化為0
char s1[max],s2[max];
int sum[max][max]; //用來儲存算出來的和(用空間換時間,lcs的精華所在)
int main()
return 0;
}void maxsum(int len1,int len2)
printf("%d\n",sum[len1][len2]);
}void initzero(int len1,int len2)
int max(int a,int b)
poj1458解題報告
最長公共字串匹配 看到他們的寫的很短很精練,真心感覺自己寫不出來,我就走我的平淡路線吧!include include using namespace std int substr 201 201 記錄到當前位置的最大匹配數 string str1,str2 intmmax int a,int b ...
poj 1458 最長公共子串行
common subsequence 題意 一行給出兩個字串s1和s2,找出他們的最長 公共子串行數量,乙個金典的動態規劃問題。用dp i j 表示字串s1取前i個,字串s2取前j個時,他們的最長公共子串行數量有多少。當s2右端又加入了乙個字元時,即表示為dp i j 1 時,如果s1 i 和s2 ...
POJ1458最長公共子串行
為了完成poj中的一題 spell checker 要寫乙個最長公共子串行的程式,居然突然全給忘了,楞是沒有寫出來,深深的鄙視自己一下。這也是一道動態規劃的典型題。遞迴實現如下 poj提交會超時,但是確實可以實現 using namespace std define max a b a b a b ...