118.杨辉三角&120.三角形最小路径和
118.杨辉三角
思路:其实也是动态规划,相当于题目给出了递推方程
代码:
cpp
class Solution {
public:
vector<vector<int>> generate(int numRows) {
vector<vector<int>> triangle(numRows);
for(int i=0;i<numRows;i++){
triangle[i].resize(i+1,1);
for(int j=1;j<i;j++){
//当前值=正上方+左上方(三角形向左对齐后)
triangle[i][j] = triangle[i - 1][j - 1] + triangle[i - 1][j];
}
}
return triangle;
}
};
120.三角形最小路径和
思路:动态规划,和网格路径和差不多,主要是边界条件的不同
根据题目要求:相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点
路径有三种情况:
(1)三角形左侧边(对齐后二维数组第一列):路径只能来自于正上方
(2)三角形右侧边(二维数组每一层最后一个):路径只能来自于左上方
(3)普通位置:路径来自于左上方或正上方(取最小值)
最后的结果为最后一行每个位置路径和的最小值
代码:
cpp
class Solution {
public:
int minimumTotal(vector<vector<int>>& triangle) {
int s=triangle.size();
vector<vector<int>> dp(s,vector<int>(s));
dp[0][0]=triangle[0][0];
//初始化每行第一个,只能从它正上方的元素来
for(int i=1;i<s;i++){
dp[i][0]=dp[i-1][0]+triangle[i][0];
}
for(int i=1;i<s;i++){
dp[i].resize(i+1,0);
for(int j=1;j<=i;j++){
//最后一个元素只能从左上方的来
if(j==i){
dp[i][j]=dp[i-1][j-1]+triangle[i][j];
}else{
dp[i][j]=min(dp[i-1][j],dp[i-1][j-1])+triangle[i][j];
}
}
}
return *min_element(dp[s-1].begin(),dp[s-1].end());
}
};