均是二维dp数组,但是通过列赋初始值后,能够优化为一维数组,通记忆上一个状态,达到二维数组的目的
1。 最简单的方式是无脑使用二维数组记录状态,然后做比较 dp[i-1][j] 和 dp[i][j-1]
2。 可优化成一维数组,通过比较 本周期前一状态(环比) dp[i-1] 和 上一周期同一状态(同比) dp[i]
对于二维dp数组,无脑比较,加上题目所给grid的值即可做出,无加赘述。
对于一维dp数组,可以采取:
1。 row向:
int[] dp = new int[rowL]
double for遍历grid时:
对 row 的遍历放在内层;
遍历从(1,1)开始;
如果要考虑(0,x)的值,在外层遍历单独考虑
2。 col向:
int[] dp = new int[colL]
double for遍历grid时:
对 col 的遍历放在内层;
遍历从(1,1)开始;
如果要考虑的值,(x,0)在外层遍历单独考虑
举例:
UniquePaths_2_63
1。 row向:
public int uniquePathsWithObstacles1(int[][] obstacleGrid) {
int rowL = obstacleGrid.length;
int colL = obstacleGrid[0].length;
int[] dp = new int[rowL];
// 初始化
for(int i=0; i<rowL; i++) {
if(obstacleGrid[i][0] != 0) {
dp[i] = 0;
break;
}
dp[i] = 1;
}
// 遍历grid
for (int j=1; j<colL; j++) {
if(obstacleGrid[0][j] != 0) { // grid边缘处理
dp[0] = 0;
}
for (int i=1; i < rowL; i++) {
if (obstacleGrid[i][j] != 0) {
dp[i] = 0;
} else { // j > 0 if (dp[i - 1] != 0)
dp[i] += dp[i - 1];
}
}
}
return dp[rowL - 1];
}
2。 col向:
public int uniquePathsWithObstacles(int[][] obstacleGrid) {
int rowL = obstacleGrid.length;
int colL = obstacleGrid[0].length;
int[] dp = new int[colL];
for(int j=0; j<colL; j++) {
if(obstacleGrid[0][j] != 0) {
dp[j] = 0;
break;
}
dp[j] = 1;
}
for (int i=1; i<rowL; i++) {
if(obstacleGrid[i][0] != 0) {
dp[0] = 0;
}
for (int j=1; j < colL; j++) {
if (obstacleGrid[i][j] != 0) {
dp[j] = 0;
} else { // j > 0
dp[j] += dp[j - 1];
}
}
}
return dp[colL - 1];
}