leetcode 2915. 和为目标值的最长子序列的长度

题目如下

数据范围

复制代码
本题就是典型的背包问题target就是容量,nums[i]就是第i个物品的重量。其实就是选最多的物品使得背包刚好装满。
令f(i,j)为当考虑到i - 1物品时刚好装到j重量的物品数。
当j >= nums[j]时 有f(i,j) = max(f(i - 1,j - nums[i - 1]) + 1,f(i - 1,j))
当j < nums[j]时 有f(i,j) = f(i - 1,j)
当i >= 0 j == 0时有f(i,j) = 0
而i ==0 j > 0时显然序列不存在 为了避免影响答案我们置为负无穷
所以我们可以写出代码

通过代码(未优化)

cpp 复制代码
class Solution {
public:
    int lengthOfLongestSubsequence(vector<int>& nums, int target) {
        int n = nums.size();
        int ans = -1;
        vector<vector<int>> dp(n + 1,vector<int>(target + 1,INT_MIN));
        for(int i = 0;i <= n;i++){
            dp[i][0] = 0;
        }
        for(int i = 1;i <= n;i++){
            for(int j = 1;j <= target;j++){
                if(j - nums[i - 1] >= 0){
                    dp[i][j] = max(dp[i - 1][j],dp[i - 1][j - nums[i - 1]] + 1);
                }
                else{
                    dp[i][j] = dp[i - 1][j];
                }
            }
           
        }
        
        return dp[n][target] > 0 ?dp[n][target] : -1;
    }
};

当然因为每一次对j的遍历只需要用到上一行的数据所以我们只需要用一维数组倒序遍历j即可(倒序是为了防止本应该用到的旧数据被覆盖)

利用滚动数组优化后移的代码

cpp 复制代码
class Solution {
public:
    int lengthOfLongestSubsequence(vector<int>& nums, int target) {
        int n = nums.size();
        int ans = -1;
        vector<int> dp(target + 1, INT_MIN);
        dp[0] = 0;
        for (int i = 1; i <= n; i++) {
            for (int j = target; j >= nums[i - 1]; j--) {
                dp[j] = max(dp[j], dp[j - nums[i - 1]] + 1);
            }
        }

        return dp[target] > 0 ? dp[target] : -1;
    }
};
相关推荐
怕浪猫44 分钟前
GEO 优化到底是什么?AI时代内容创作者必须懂的新技能
算法·面试·github
朝朝辞暮i2 小时前
C++ 第 23 课:class —— 开始真正进入面向对象
开发语言·c++·算法
7yewh2 小时前
SLAM 三维空间刚体运动(2)
数据结构·人工智能·机器人·嵌入式·slam
Evand J2 小时前
【MATLAB例程】三维RRT+APF避障路径规划与到达角(AOA)定位算法|三维路径优化与定位仿真例程
算法·matlab·路径规划·代码·定位·rrt·aoa
leikooo3 小时前
用餐厅和盘子理解栈和堆
java·数据结构·链表·rust
郑同学的笔记3 小时前
【c++随笔28】strcmp 和 memcmp对比
开发语言·c++
随意起个昵称3 小时前
【背包dp】输出方案路径
c++·动态规划
weixin_307779134 小时前
有限产能智能排产与动态重排智能体:从需求解构到技术实现
开发语言·人工智能·算法·架构
朝朝辞暮i4 小时前
C++ 第 27 课:智能指针 shared_ptr
开发语言·c++·算法
by209994 小时前
学会使用std::string类,并理解其内部是如何管理字符串的详细阐述(上)
c++·笔记·字符串·类和对象·string