classSolution{// i, j 是回文// public String longestPalindrome(String s){char[] cs = s.toCharArray();int m = cs.length;int maxLength =1;int begin =0;if(m <2){return s;}boolean[][] result =newboolean[m][m];for(int i =0; i < m; i++){
result[i][i]=true;}for(int i =1; i < m; i++){for(int j =0; j < i; j++){if(cs[i]!= cs[j]){
result[i][j]=false;}else{if(i - j <3){
result[i][j]=true;}else{
result[i][j]= result[i -1][j +1];}}if(result[i][j]&& i - j +1> maxLength){
maxLength = i -j +1;
begin = j;}}}return s.substring(begin, maxLength + begin);}}
classSolution{publicintminPathSum(int[][] grid){int m = grid.length;int n = grid[0].length;int[][] dp =newint[m][n];
dp[0][0]= grid[0][0];for(int i =1; i < m; i++){
dp[i][0]= dp[i-1][0]+ grid[i][0];}for(int i =1; i < n; i++){
dp[0][i]= dp[0][i-1]+ grid[0][i];}for(int i =1; i < m; i++){for(int j =1; j < n; j++){
dp[i][j]= Math.min(dp[i-1][j], dp[i][j-1])+ grid[i][j];}}return dp[m-1][n-1];}}
classSolution{publicintlengthOfLIS(int[] nums){if(nums.length ==0){return0;}int[] dp =newint[nums.length];int result =1;
dp[0]=1;for(int i =1; i < nums.length; i++){int max =0;for(int j =0; j < i; j++){if(nums[i]> nums[j])
max = Math.max(dp[j], max);}
dp[i]= max +1;
result = Math.max(result, dp[i]);}return result;}}
classSolution{publicintcountSquares(int[][] matrix){int m = matrix.length;int n = matrix[0].length;int[][] dp =newint[m][n];int result =0;for(int i =0; i < m; i++){
dp[i][0]= matrix[i][0];
result += dp[i][0];}for(int i =1; i < n; i++){
dp[0][i]= matrix[0][i];
result += dp[0][i];}for(int i =1; i < m; i++){for(int j =1; j < n; j++){if(matrix[i][j]==0)
dp[i][j]=0;else
dp[i][j]= Math.min(dp[i-1][j], Math.min(dp[i-1][j-1], dp[i][j-1]))+1;
result += dp[i][j];}}return result;}}