第十一周(Dynamic ProgrammingV)
目录:
- 本周完成题目
- 主要过程思路
- 相关代码
一、本周完成题目
本周共完成2道题目,2道Medium。主要是继续针对于所学的Dynamic Programming选择了一些题目进行练习。
具体完成题目及难度如下表:
# | Title | Difficulty |
---|---|---|
64 | Minimum Path Sum | Medium |
300 | Longest Increasing Subsequence | Medium |
题目内容
1、Minimum Path Sum
Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which minimizes the sum of all numbers along its path.
Note: You can only move either down or right at any point in time.
题目大意:给一个m*n的矩阵,只能向右或者向下移动,问移动到右下角经过最短的和是多少。
2、Longest Increasing Subsequence
Given an unsorted array of integers, find the length of longest increasing subsequence.
For example,
Given [10, 9, 2, 5, 3, 7, 101, 18],
The longest increasing subsequence is [2, 3, 7, 101], therefore the length is 4. Note that there may be more than one LIS combination, it is only necessary for you to return the length.
题目大意:给定一个未排序的整数数组,判断最长的递增子序列长度。
二、主要过程思路
本周的题目使用到了Dynamic Programming的思想,简单来说需要从逐步到整体,动态操作最后得到需要的结果。
1、Minimum Path Sum:
这题的思路比较简单,只需要判断每一个位置上面的位置和左边位置数字累计大小的大小,选择较小的那个作为该位置的累加值即可。这里需要将第一行与第一列的数字单独计算,因为只有一种选择情况。
2、Longest Increasing Subsequence:
依然是动态规划的方式。这题与课上讲过的一道题很类似。设定一个res[i]代表第i个数字前面比的最长递增数列长度。主要思路是对于每个数字i,搜索在它前面的所有数字,如果搜索到比它小的数字则对于该数字的res值进行判断,找到最大的res值加一。递归公式如下:
for(int i=1;i<n;i++){
for(int j=0;j<i;j++){
if(nums[j]<nums[i]){
res[i]=max(res[i],res[j]+1);
}
}
}
最后再次遍历这些数字,找到res[i]中最大的数字并加一。
三、相关代码
Minimum Path Sum
class Solution {
public:
int minPathSum(vector<vector<int>>& grid) {
int m = grid.size(), n = grid[0].size();
for(int j=1;j<n;j++){
grid[0][j]+= grid[0][j-1];
}
for(int i=1;i<m;i++){
grid[i][0]+= grid[i-1][0];
}
for(int i=1;i<m;i++){
for(int j=1;j<n;j++){
grid[i][j]+=min(grid[i-1][j],grid[i][j-1]);
}
}
return grid[m-1][n-1];
}
};
Longest Increasing Subsequence
class Solution {
public:
int lengthOfLIS(vector <int >& nums) {
int n=nums.size();
if(n==0) return 0;
vector <int > res(n,0);
for(int i=1;i<n;i++){
for(int j=0;j<i;j++){
if(nums[j]<nums[i]){
res[i]=max(res[i],res[j]+1);
}
}
}
int length=0;
for(int i=0;i<n;i++){
length=max(length,res[i]);
}
return length+1;
}
};