第十一周(Dynamic ProgrammingV)

第十一周(Dynamic ProgrammingV)

目录:

  • 本周完成题目
  • 主要过程思路
  • 相关代码

一、本周完成题目

本周共完成2道题目,2道Medium。主要是继续针对于所学的Dynamic Programming选择了一些题目进行练习。

具体完成题目及难度如下表:

#TitleDifficulty
64Minimum Path SumMedium
300Longest Increasing SubsequenceMedium

题目内容

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;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值