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