nyoj 36 最長公共子串行
方法一:
先選擇狀態的儲存結構,即最優子問題,用f(i,j)表示字串a的前i位和字串b的前j位的最長公共子串行.
階段:很明顯共有strlen(a)個階段
每個狀態的決策: if(a[i]==a[j])
f(i,j)=f(i-1,j-1)+1
else f(i,j)=max( f(i-1,j), f(i,j-1) );
儲存用了奇偶優化
#include#include#define maxs(x,y) (x>y)?x:y
char a[1010],b[1010];
int f[2][1010];
int main()
else f[i&1][j]=maxs(f[(i-1)&1][j],f[i&1][j-1]);
}
printf("%d\n",f[la&1][lb]);
}
}
方法二:
狀態: f[i+1]表示字串b的前i位與字串a的最長公共子串行
階段: 共有strlen(a)個階段 每個階段共有strlen(b)個狀態
決策: f[i]怎麼改變.
if(a[i]==b[j]) f[i+1]必定要改變 其應該等於第f[i]的上一階段的狀態+1
else 則後一位一定不小於前一位 則有 if(f[i]>f[i+1]) f[i+1]=f[i]
#include #include#define max(x,y) x>y?x:y
char a[1005],b[1005];
int f[1005];
int main()
printf("%d\n",f[lb]);
}}
演算法之最長公共子串行問題
一 問題描述 最長公共子串行 longest common sequence 什麼是子串行呢?即乙個給定的序列的子串行,就是將給定序列中零個或多個元素去掉之後得到的結果。子串行每個元素的下標嚴格遞增。如上圖,給定的字串行 它的子串行示例 即元素b,d,g,h被去掉後,保持原有的元素序列所得到的結果就...
動態規劃之最長公共子串行 最長公共子串
題目 如果字串1的所有字元按其在字串中的順序出現在另外乙個字串2中,則字串1稱之為字串2的子串行。注意,並不要求子子串行 字串1 的字元必須連續出現在字串2中。請編寫乙個函式,輸入兩個字串,求它們的最長公共子串,並列印出最長公共子串行。例如 輸入兩個字串bdcaba和abcbdab,字串bcba和b...
動態規劃之最長公共子串行問題
由最長公共子串行問題的最優子結構性質建立子問題最優值的遞迴關係。用c i j 記錄序列x和y的最長公共子串行的長度,其中,xi yj 當i 0或j 0時,空序列是xi和yj的最長公共子串行。故此時c i j 0。其他情況下,由最優子結構性質可建立遞迴關係如下 void lcslength int m...