多维动态规划
62. 不同路径
java
// 方法一:二维数组动态规划,可以数学方法优化
class Solution {
public int uniquePaths(int m, int n) {
int[][] matrix = new int[m][n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (i == 0 || j == 0) {
matrix[i][j] = 1;
} else {
matrix[i][j] = matrix[i - 1][j] + matrix[i][j - 1];
}
}
}
return matrix[m - 1][n - 1];
}
}
// 方法二:官解优化
class Solution {
public int uniquePaths(int m, int n) {
long ans = 1;
for (int x = n, y = 1; y < m; ++x, ++y) {
ans = ans * x / y;
}
return (int) ans;
}
}64. 最小路径和
java
class Solution {
public int minPathSum(int[][] grid) {
for (int j = 1; j < grid[0].length; j++) {
grid[0][j] += grid[0][j - 1];
}
for (int i = 1; i < grid.length; i++) {
grid[i][0] += grid[i - 1][0];
}
for (int i = 1; i < grid.length; i++) {
for (int j = 1; j < grid[0].length; j++) {
grid[i][j] += Math.min(grid[i - 1][j], grid[i][j - 1]);
}
}
return grid[grid.length - 1][grid[0].length - 1];
}
}5. 最长回文子串
java
//所有的子串可以通过二维数组(i,j)表示
class Solution {
public String longestPalindrome(String s) {
int start = 0, end = 0;
boolean[][] dp = new boolean[s.length()][s.length()];
for (int i = 0; i < s.length(); i++) {
dp[i][i] = true;
}
for (int j = 1; j < s.length(); j++) {
for (int i = 0; i < j; i++) {
if (s.charAt(i) == s.charAt(j)) {
if (j - i < 3 || dp[i + 1][j - 1]) {
dp[i][j] = true;
if (j - i > end - start) {
start = i;
end = j;
}
}
}
}
}
return s.substring(start, end + 1);
}
}