动态规划 : 台阶问题、LIS及LCS问题 --java

版权声明:转载请声明转自Juanlyjack https://blog.csdn.net/m0_38088359/article/details/82954668

1、台阶问题:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。

public class Solution {
    public int JumpFloor(int target) {
        if(target <= 0){
            return 0;
        }
        int pre = 1;
        int last = 2;
        if(target == 1 || target == 2){
            return target;
        }
        else{
            for(int i=3;i<=target;i++){
                int temp = pre + last;
                pre = last;
                last = temp;
            }
        }
        return last;
    }
}

2、请设计一个尽量优的解法求出序列的最长上升子序列的长度。

给定一个序列A及它的长度n(长度小于等于500),请返回LIS的长度。

注意:必须返回的是上升的子序列,而且是最长的,显然这是一个动态规划问题,详情看代码。

测试样例:
[1,4,2,5,3],5
返回:3

import java.util.*;

public class LongestIncreasingSubsequence {
    public int getLIS(int[] A, int n) {
        // write code here
        int[] res = new int[A.length];
        res[0] = 1;
        int RM = 0;
        for(int i =1;i<n;i++){
            int Max = 0;
            for(int j=0;j<i;j++){
                if(A[j]<A[i] && Max<res[j]){
                    Max = res[j];
                }
            }
            res[i] = Max + 1;
            if(RM<res[i]){
                RM = res[i];
            }
        }
        return RM;
    }
}

3、LCS问题:即最长公共子序列问题.
给定两个字符串A和B,返回两个字符串的最长公共子序列的长度。例如,A="1A2C3D4B56”,B="B1D23CA45B6A”,”123456"或者"12C4B6"都是最长公共子序列。

给定两个字符串A和B,同时给定两个串的长度n和m,请返回最长公共子序列的长度。保证两串长度均小于等于300。

测试样例:
“1A2C3D4B56”,10,“B1D23CA45B6A”,12
返回:6

import java.util.*;

public class LCS {
 public int findLCS(String A, int n, String B, int m) {
    	if(n==0||m==0){
    		return 0;
    	}
        char[] a = A.toCharArray();
        char[] b = B.toCharArray();
    	int[][] result = new int[n+1][m+1];
    	//因为最长公共子串可能为0,所以第一行第一列为0,不用第一步再额外判断字符串是否为空
    	for(int i=0;i<n;i++){
    		for(int j=0;j<m;j++){
/*
result[i][j]的取值分了三种情况:
一:来自result[i-1][j]
二:来自result[i][j-1]
三:来自result[i-1][j-1] +1,这里是由于str1[i]==str2[j].
所以这里只要取他们三者最大值即可!
*/
    			result[i+1][j+1] = Math.max(result[i][j+1],result[i+1][j] );
    			if(a[i]==b[j]){
    				result[i+1][j+1] = Math.max(result[i+1][j+1],result[i][j]+1);
    				}
    		}
    	}
    	return result[n][m];
    }
}

猜你喜欢

转载自blog.csdn.net/m0_38088359/article/details/82954668