半數集合和最長公共子串

2022-02-19 11:29:45 字數 2167 閱讀 2440

半數集問題

問題描述:

給定乙個自然數n,由n 開始可以依次產生半數集set(n)中的數如下。

(1) n∈set(n);

(2) 在n 的左邊加上乙個自然數,但該自然數不能超過最近新增的數的一半;

(3) 按此規則進行處理,直到不能再新增自然數為止。

例如,set(6)=。半數集set(6)中有6 個元素。

注意半數集是多重集。

演算法設計:

對於給定的自然數n,計算半數集set(n)中的元素個數

解題思路

半數集的公式是

一 遞迴過程分析

通過分析所描述問題的特點可知,半數集set(n)中元素個數的求解是個遞迴的過程。設set(n)中的元素個數為f(n),則顯然有遞迴表示式:

f(n)=1+∑f(i),i=1,2……n/2

據此,可很容易設計出求f(n)的遞迴演算法如下:

intbsj(int n)      

對於此遞迴過程,是存在有缺陷的,即有很多的重複子問題計算。比如說:當n=4時,f(4)=1+f(1)+f(2),而f(2)=1+f(1),因此,在計算f(2)的時候又要重複計算一次f(1)。更進一步,當n較大時,類似的重複子問題計算將會變得非常多。

二 改進的遞迴演算法

可以對如上的遞迴演算法進行改進,用陣列來儲存已計算過的子問題結果,就可以避免重複,提高演算法效率。改進的遞迴演算法如下:

int bsj(int n)

#include

longa[10001];  

usingnamespacestd;  

intmain()  

return0;  

}  16.longbsj(intn)  

17.   

動態規劃:最長公共子串

問題描述

我們稱序列z = < z1, z2, ..., zk >是序列x = < x1, x2, ..., xm

>的子串行當且僅當存在嚴格上公升的序列< i1, i2, ..., ik >,使得對j = 1, 2, ... ,k, 有xij = zj。比如z = < a, b, f, c >

是x = < a,

b, c, f, b, c >的子串行。

現在給出兩個序列x和y,你的任務是找到x和y的最大公共子串行,也就是說要找到乙個最長的序列z,使得z既是x的子串行也是y的子串行。

輸入資料

輸入包括多組測試資料。每組資料報括一行,給出兩個長度不超過200的字串,表示兩個序列。兩個字串之間由若干個空格隔開。

輸出要求

對每組輸入資料,輸出一行,給出兩個序列的最大公共子串行的長度。

解題思路

如果我們用字元陣列s1、s2存放兩個字串,用s1[i]表示s1中的第i個字元,s2[j]表示s2中的第j個字元(字元編號從1開始,不存在「第0個字元」),用s1i表示s1的前i個字元所構成的子串, s2j表示s2的前j個字元構成的子串,maxlen(i, j)表示s1i 和s2j的最長公共子串行的長度,那麼遞推關係如下:

if( i ==0 || j == 0 )

else if( s1[i] == s2[j] )

maxlen(i, j) = maxlen(i-1, j-1 ) + 1;

else

#define maxsize 200

#include

#include

char p[maxsize+10];

char q[maxsize+10];

int maxcomlen[maxsize+10][maxsize+10]; //maxcomlen[i][j]表示以第乙個串第i個元素,第二個串第j個元素為終點的最大公共子串

int main()

if (maxcomlen[i][j]>maxlen) //輸出最大的長度,按照定義應該為最後乙個元素

maxlen=maxcomlen[i][j];

} }

printf("%d/n",maxlen);

} return 0;

}

最長公共子串和最長公共子串行

二者含義沒搞清楚,雅虎的筆試就這樣的寫錯了。求最長公共字串的題目寫成了最長公共子串行。子串要求字元必須是連續的,但是子串行就不是這樣了。悲催了。子串行跟子串的求法類似,都是使用動態規劃的思想,s1每次增加乙個字元,看與s2當前位置的字元是不是相同,如果相同做相應的處理,如果不同,做另外的處理。子串行...

最長公共子串行和最長公共子串

問題定義 最長公共子串行,序列的意思是順序對就可以,並不需要是連續的。例如 abcde oalblcldle其中abcde就是這兩個字串的最長公共子串行。容易知道乙個長度為n的字串的子串行有2 n 個,假設兩個字串的長度都為n,直接去求解兩個字串的最長公共子串行需要用這2 n 個序列串去匹配另外乙個...

最長公共子串行 最長公共子串

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...