王道机试指南读后总结-6(动态规划等)

    xiaoxiao2021-03-25  70

    递推求解:

    N阶楼梯上楼问题。一次可走一阶或两阶,问有多少种上楼方式。 这同时也是裴波那契数列问题,当N>2时,走最后一次有两种情况,分从N-1到N和N-2到N,则F(N)=F(N-1)+F(N-2)。 错排问题:   错排公式为F(N)=(N-1)*F(N-1)+(N-1)*F(N-2),N个信封,N个信,N个信封中的信全部装错的种类。

    动态规划:

    最长递增子序列(LIS): //dp int num[51]; //整个序列 int dp[51]; //存储了每个数字之前的最长递增子序列长度 for(i=1;i<50;i++){ nmax=1; //每个最小是1 for(j=1;j<i;j++){ //遍历之前所有数字 if(a[j]<a[i]) nmax=max(nmax,dp[j]+1); //若dp[j]+1大于当前最长子序列,更新 } dp[i]=nmax; //遍历完一个数字之前的序列,把最大长度存入 } //之后最大值其实和最后一个dp相等 最长公共子序列(LCS): // char s1[101],s2[101]; //两个字符串 int dp[101][101]; //存最长公共子序列长度 for(i=0;i<101;i++) dp[i][0]=0; for(j=0;j<101;j++) dp[0][j]=0; for(i=0;i<101;i++){ for(j=0;j<101;j++){ //用二重循环求得每个dp[][]的值 if(s1[i]!=s2[j]) //如果两个字符不等 dp[i][j]=max(dp[i-1][j],dp[i][j-1]); else dp[i][j]=dp[i-1][j-1]+1; //若它们相等,则加一 } }
    转载请注明原文地址: https://ju.6miu.com/read-33147.html

    最新回复(0)