C 動態規劃之遞推求解及最長公共子串行

2021-08-20 02:43:40 字數 1001 閱讀 4354

利用遞推求解解決問題,我們就要模仿求斐波那契數列的過程。首先,確定規模較小的問題方案,然後考慮如何由這幾個規模較小的答案推出後面的答案。

1.n階樓梯上樓問題,一次可以走兩階或一階,問有多少種上樓方法

輸入包括乙個整數n 如 4

輸出 上樓方式  5

f[n]為台階方式總數,f[1]=1,f[2]=2,當n大於2,每種上台階方式最後一步有兩種方式

從n-1階到n階,其上樓方式為fn-1,從n-2階到n階,上樓方式為fn-2。所以fn=fn-1+fn-2

#includelong long f[91];

int main()

int n;

while(scanf("%d",&n)!=eof)

return 0;

}

2.最長公共子串行  

有兩個字串s1和s2,求乙個最長公共子串s3,它同時是s1和s2的子串,且要求他的長度最長,並確定這個長度。我們稱之為最長公共子串行。

思路:dp[i][j]表示s1前i個字元與s2前j個字元分別組成的字串的最長公共子串行 。若s1[i]==s2[j],必存在乙個以s1x和s2y結尾的最長公共子串行 dp[i][j]=dp[i-1][j-1]+1。若不等,則為 dp[i-1][j],dp[i][j-1]之中的較大者。即:

dp[0][j](0<=j<=m)=0, dp[i][0](0<=i<=n)=0,

dp[i][j]=dp[i-1][j-1]+1;(s1[i]==s2[j]) 

dp[i][j]=max;(s1[i]!=s2[j])

輸入 abcd cxbydz

輸出2 

#include#includeint dp[101][101];

int max(int a,int b)

int main()

} printf("%d\n",dp[l1][l2]);

} return 0;

}

動態規劃求解最長公共子串行(LCS)

看了 演算法導論 中文第二版p208的動態規劃求解lcs問題,覺得很讚,但總覺得算導寫得有些晦澀,希望自己能寫得簡單易懂一些,純當鍛鍊了,歡迎指導交流。首先,子串行和子串是不一樣的。子串是連續的,而子串行中的元素組成可以是不連續的,但元素的位置下標一定是遞增的。以乙個字串s abcdef 為例,字串...

最長公共子串行 動態規劃求解

問題 例如 x y 那麼,二者的最長公共子串行是,長度為4。我們首先需要搞清楚以下兩個概念 最長公共子串行 vs 最長公共子串 找兩個字串的最長公共子串,這個子串要求在原字串中是連續的。而最長公共子串行則並不要求連續。上述問題中的最長公共子串行與最長公共子串是一樣的。但是再舉例x y 二者的最長公共...

c語言求解動態規劃之最長公共子串行

最長公共子串行問題 若給定序列x 則另一串行z 是x的子串行是指存在乙個嚴格遞增下標序列使得對於所有j 1,2,k有 zj xij。例如,序列z 是序列x 的子串行,相應的遞增下標序列為。給定2個序列x和y,當另一串行z既是x的子串行又是y的子串行時,稱z是序列x和y的公共子串行。給定2個序列x 和...