63. 不同路径 II
非常常规的题了,很easy吧。
long long uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
int xLength_ = obstacleGrid.size();
int yLngth_ = obstacleGrid[0].size();
long long dp_[128][128] = { 0 };
long long upCount_ = 0, leftCount_ = 0;
dp_[0][0] = 1;
for (int i = 0; i < xLength_; i++) {
for (int j = 0; j < yLngth_; j++) {
if (obstacleGrid[i][j] == 1) {
dp_[i][j] = 0;
continue;
}
if (0 == i && 0 == j)
continue;
upCount_ = i - 1 < 0 ? 0 : dp_[i - 1][j];
leftCount_ = j - 1 < 0 ? 0 : dp_[i][j - 1];
dp_[i][j] = upCount_ + leftCount_;
}
}
return dp_[xLength_ - 1][yLngth_ - 1];
}
执行结果:

91. 解码方法
int numDecodings(string s) {
if(s.length() == 0)
return 0;
int dp_[4096] = { 0 };
dp_[0] = 1;
if(s[0] > '0' && s[0] <= '9')
dp_[1] = 1;
int j = 2;
for(int i = 1; i < s.length(); i++, j++) {
if(s[i - 1] == '2' && (s[i] >= '0' && s[i] <= '6') ||
s[i - 1] == '1') {
dp_[j] += dp_[j - 2];
}
if(s[i] > '0' && s[i] <= '9')
dp_[j] += dp_[j - 1];
}
return dp_[s.length()];
}
执行结果:

221. 最大正方形
int min_(int a, int b, int c) {
return a < b ? a < c ? a : c : b < c ? b : c;
}
int maximalSquare(vector<vector<char>>& matrix) {
if(matrix.empty())
return 0;
int maxSquare_ = 0;
int xLen_ = matrix.size();
int yLen_ = matrix[0].size();
int dp_[1024][1024] = { 0 };
for(int i = 0; i < xLen_; i++) {
for(int j = 0; j < yLen_; j++) {
if(matrix[i][j] == '0')
continue;
int minSide_ = 0;
if(i > 0 && j > 0)
minSide_ = min_(dp_[i - 1][j], dp_[i][j - 1], dp_[i - 1][j - 1]);
dp_[i][j] = minSide_ + 1;
if(dp_[i][j] > maxSquare_)
maxSquare_ = dp_[i][j];
}
}
return maxSquare_ * maxSquare_;
}

本文深入探讨了三道经典的动态规划问题:不同路径II、解码方法与最大正方形,提供了详细的代码实现与思路解析,适合算法初学者及进阶者巩固动态规划技巧。
3424

被折叠的 条评论
为什么被折叠?



