# 问题1：最长上升子序列

dp[i]=max(dp[i],dp[j]+1)，其中0<=j<i且nums[j]<nums[i]

public class Solution {
/**
* @param nums: An integer array
* @return: The length of LIS (longest increasing subsequence)
*/
public int longestIncreasingSubsequence(int[] nums) {
if(nums==null||nums.length==0)  return 0;
int[] dp=new int[nums.length];
int maxlength=0;
for(int i=0;i<nums.length;i++){   //dp[i]表示到i数为止最长的上升子序列长度
dp[i]=1;
for(int j=0;j<i;j++) {
if(nums[j]<nums[i]) {
dp[i] = Math.max(dp[i], dp[j]+1);
}
}
maxlength=Math.max(dp[i],maxlength);
}
return maxlength;
}
}

# 问题2：最长公共子序列

dp[i][j]表示字符串A匹配到i，字符串B匹配到j时的最长公共子序列长度。

dp[i][j]=0  ,  i==0 || j==0

dp[i][j]=dp[i-1][j-1]+1， A[i-1]==B[j-1]

dp[i][j]=max(dp[i][j-1],dp[i-1][j])，  A[i-1]!=B[j-1]

public class Solution {
/**
* @param A: A string
* @param B: A string
* @return: The length of longest common subsequence of A and B
*/
public int longestCommonSubsequence(String A, String B) {
if(A.length()==0 || B.length()==0) return 0;
int[][] dp=new int[A.length()+1][B.length()+1];  //dp[i][j]表示字符串A匹配到i，字符串B匹配到j时的最大长度
int maxLength=0;
for(int i=1;i<=A.length();i++){
for(int j=1;j<=B.length();j++){
if(A.charAt(i-1)==B.charAt(j-1)){
dp[i][j]=dp[i-1][j-1]+1;
}else{
dp[i][j]=Math.max(dp[i-1][j],dp[i][j-1]);
}
maxLength=Math.max(maxLength,dp[i][j]);
}
}
return maxLength;
}
}

# 问题3：最长公共子串

dp[i][j]=0  ,  i==0 || j==0  或 A[i-1]!=B[j-1]

dp[i][j]=dp[i-1][j-1]+1， A[i-1]==B[j-1]

public class Solution {
/**
* @param A: A string
* @param B: A string
* @return: the length of the longest common substring.
*/
public int longestCommonSubstring(String A, String B) {
if(A.length()==0 || B.length()==0) return 0;
int[][] dp=new int[A.length()+1][B.length()+1];  //dp[i][j]表示字符串A匹配到i，字符串B匹配到j时的最大长度
int maxLength=0;
for(int i=1;i<=A.length();i++){
for(int j=1;j<=B.length();j++){
if(A.charAt(i-1)==B.charAt(j-1)){
dp[i][j]=dp[i-1][j-1]+1;
}else{
dp[i][j]=0;
}
maxLength=Math.max(maxLength,dp[i][j]);
}
}
return maxLength;
}
}