半數集問題
問題描述:
給定乙個自然數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...