首页 > 其他分享 >【力扣】300. 最长递增子序列(DFS+DP两种方法实现)

【力扣】300. 最长递增子序列(DFS+DP两种方法实现)

时间:2024-03-29 17:32:02浏览次数:24  
标签:nums 300 res DFS 力扣 int DP dp size

目录

题目传送

原题目链接

最长递增子序列[DFS 方法]

DFS方法思路图

在这里插入图片描述

思路简述

  • 对于序列中的每一个数字只有选择和不选择两种状态
  • 如果选择了,方案数就加一
  • 否则方案不变
  • 进入下一次选择则 i 后移
  • i 越界时更新方案的最大值即可

代码

#include <iostream>
//最长递增子序列
using namespace std

class Solution {
public:
    int size;
    int res;
    vector<int> arr;
    int lengthOfLIS(vector<int>& nums) {
        res = 0;
        size = nums.size();
        arr = nums;
        dfs(0, INT_MIN, 0);
        return res;
    }
    inline void dfs(int i, int pre, int count) {
        if (i == size) {
            res = max(count, res);          //更新最大值
            return;
        }
        if (arr[i] > pre) {
            dfs(i+1, arr[i], count+1);      //选择
        }
        dfs(i+1, pre, count);               //不选择
    }
};

大家可以自行考虑有没有优化的方法

最长递增子序列[DP]方法

DP方法思路图

在这里插入图片描述

思路简述

  • i 枚举每一个数字
  • j每次枚举找到 i 位置前所有比 i 位置数小的数字的dp[j]最大值
  • 如果dp[j] > dp[i] –> dp[i] = dp[j] + 1

从而推导出状态转移方程:
前提条件: dp[i] > dp[j]

dp[i] = max(dp[i], dp[j] + 1)

代码方案

class Solution {
public:
    vector<int> dp;
    int lengthOfLIS(vector<int>& nums) {
        int size = nums.size();
        dp.resize(size, 1);
        for (int i = 0; i < size; i++) {
            for (int j = 0; j < i; j++) {
                if (nums[i] > nums[j]) {
                    dp[i] = max(dp[j] + 1, dp[i]);
                }
            }
        }
        int res = 0;
        for (int i = 0; i < size; i++) {
            res = max(res, dp[i]);
        }
        return res;
    }
};

标签:nums,300,res,DFS,力扣,int,DP,dp,size
From: https://blog.csdn.net/2301_79640368/article/details/137151752

相关文章

  • 批量电子盖章_电子骑缝章_易友EU3000智能盖章宝(e-章宝)
    批量电子盖章_电子骑缝章_易友EU3000智能盖章宝(e-章宝)介绍“e章宝”智能盖章软件www.eyoue.com可以在不打印、不扫描、不压缩的情况下,将一个没有签名盖章的PDF电子文件,处理成一个带有签名和印章,以及骑缝章的电子文件。“e章宝”的应用场景:凡是使用带有签名、印章、齐缝章......
  • 解决:NuxtJS项目 ,刷新localhost:3000/product/details/111页面的时候useFetch不工作!
    背景在nuxt项目中,点击产品列表跳转到详情页是正常的,路径为:localhost:3000/product/device?id=111但是对着浏览器刷新之后,发现不在执行请求了。要解决问题:刷新浏览器之后正常展示产品内容。   目录层级|pages|product|device.vue|......
  • 力扣HOT100热题宝典--第3节
    ......
  • 力扣HOT100热题宝典--第1节
    ......
  • 5.Hadoop HDFS 命令
    5.1启动HadoopMuti-NodeClusterstart-all.sh5.2创建与查看HDFS目录创建user目录:hadoopfs-mkdir/user创建user下hduser子目录:hadoopfs-mkdir/user/hduser创建hduser下test子目录:hadoopfs-mkdir/user/hduser/test查看之前创建的HDFS目录: 一次查看HDFS所有子目......
  • 力扣刷题Days26-122.买股票最佳时期||(js)
    目录1,题目2,代码动态规划3,回顾与总结3.1解题思路回顾(1)定义状态(2)转移方程3.2javascript中语法二维数组的创建3.3动态规划状态变化的实现1,题目给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。在每一天,你可以决定是否购买和/或出售股票......
  • 路径总和 II(力扣 dfs)
    /***Definitionforabinarytreenode.*structTreeNode{*intval;*TreeNode*left;*TreeNode*right;*TreeNode():val(0),left(nullptr),right(nullptr){}*TreeNode(intx):val(x),left(nullptr),right(nullptr){}*......
  • 蓝桥杯——仙境诅咒(dfs)
    问题描述:思路概述:1)准备工作:(1)设立一个数组vector<pair<double,double>>p,存储每个人的位置;(2)设立一个数组vector<vector<int>>a,记录每个人所对应的距离小于D的人都有谁;(3)设立一个数组boolvis[12345]={0},记录每个人是否被污染;2)搜索:(1)第一个人已经被污染了,vis[0]=1;dfs......
  • 力扣由浅至深 每日一题.16 ​ 合并两个有序数组​
    日复一日的生活里也会有新的快乐                 ——24.3.27合并两个有序数组给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。请你 合并 nums2......
  • 力扣:回文数判断 java
    给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。示例1:输入:x=121输出:true示例2:输入:x=-121输出:false解释:从左向右读,为-121。从右向左读,......