首页 > 编程语言 >常见面试题--动态规划介绍(附C++源码实现)

常见面试题--动态规划介绍(附C++源码实现)

时间:2024-04-03 23:59:59浏览次数:39  
标签:面试题 vector -- 问题 int 算法 源码 动态

关注我,持续分享逻辑思维&管理思维; 可提供大厂面试辅导、及定制化求职/在职/管理/架构辅导;
有意找工作的同学,请参考博主的原创:《面试官心得--面试前应该如何准备》,《面试官心得--面试时如何进行自我介绍》, 《做好面试准备,迎接2024金三银四》。
图解《程序员面试常见的十大算法》及代码实现

-------------------------------------正文----------------------------------------

动态规划算法,是一种在数学、计算机科学、和经济学中用于优化多阶段决策过程的算法。它的基本思想是将问题分解成若干个子问题,先求解子问题,并将这些子问题的解存储起来,以便在解决更大问题时重用,从而避免重复计算。动态规划算法适用于具有重叠子问题和最优子结构性质的问题,这类问题在分解后得到的子问题往往不是互相独立的,而是存在依赖关系。动态规划算法的时间复杂度通常低于朴素解法,因为它通过记忆化存储已经解决的子问题的答案来减少计算量。

动态规划算法的特点包括:
重叠子问题:在求解过程中,相同的子问题可能会被多次计算。动态规划通过保存已解决的子问题的答案来避免重复计算。
最优子结构:如果问题的最优解所包含的子问题的解也是最优的,则称该问题具有最优子结构性质。这为动态规划算法提供了重要线索。
填表格式:动态规划算法使用一个表格来记录所有已解的子问题的答案,这个表格被称为状态表或动态规划表。
动态规划算法的应用非常广泛,例如在背包问题、上楼梯问题等场景中都有应用。通过将一个大问题分解成若干个小问题,并逐步解决这些小问题,最终得到原问题的解。

以下是一个简单的动态规划(DP)问题的C++实现例子,例子中解决的是子序列和问题。
问题描述:给定一个整数序列,找出其中和最大的非空子序列。

#include <iostream>
#include <vector>
 
using namespace std;
 
int maxSubsequenceSum(const vector<int>& seq) {
    int maxSum = seq[0], currentSum = maxSum;
    for (int i = 1; i < seq.size(); ++i) {
        currentSum = max(seq[i], currentSum + seq[i]);
        maxSum = max(maxSum, currentSum);
    }
    return maxSum;
}
 
int main() {
    vector<int> seq = {-2, 1, -3, 4, -1, 2, 1, -5, 4}; // 例子序列
    cout << "最大子序列和为: " << maxSubsequenceSum(seq) << endl;
    return 0;
}

再来看上面提到的背包问题:
有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i],得到的价值是value[i]
。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。

#include <iostream>
#include <vector>
using namespace std;
 
// 动态规划解决背包问题
vector<int> knapsack(int W, vector<int>& weight, vector<int>& value) {
    int n = weight.size();
    vector<vector<int>> dp(n + 1, vector<int>(W + 1, 0));
 
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= W; ++j) {
            if (weight[i - 1] <= j) {
                dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i - 1]] + value[i - 1]);
            } else {
                dp[i][j] = dp[i - 1][j];
            }
        }
    }
 
    // 打印最终的背包内物品的最大价值
    cout << "最大价值: " << dp[n][W] << endl;
 
    // 构造解决方案
    vector<int> solution;
    for (int i = n, j = W; i > 0; --i) {
        if (dp[i][j] > dp[i - 1][j]) {
            solution.push_back(i);
            j -= weight[i - 1];
        }
    }
 
    return solution;
}
 
int main() {
    int W; // 背包的总重量
    vector<int> weight = {2, 1, 3}; // 物品的重量
    vector<int> value = {3, 2, 4};  // 物品的价值
 
    // 用户输入背包的总重量
    cout << "请输入背包的总重量: ";
    cin >> W;
 
    // 调用动态规划函数
    vector<int> solution = knapsack(W, weight, value);
 
    // 打印解决方案
    cout << "解决方案: ";
    for (int i : solution) {
        cout << i << " ";
    }
    cout << endl;
 
    return 0;
}

感兴趣的同学辛苦 关注/点赞 ,持续分享逻辑、算法、管理、技术、人工智能相关的文章。

博主其它经典原创:《管理心得--如何高效进行跨部门合作》,《技术心得--如何成为优秀的架构师》、《管理心得--如何成为优秀的架构师》、《管理心理--程序员如何选择职业赛道》,及
C#实例:SQL如何添加数据》,《C#实战分享--爬虫的基础原理及实现》欢迎大家阅读

标签:面试题,vector,--,问题,int,算法,源码,动态
From: https://blog.csdn.net/weixin_60437218/article/details/137262848

相关文章

  • IDEA 中能提高开发效率的插件
    目录前言插件RainbowBracketsAceJumpPOJOtoJSONJsonHelperMybatisXMavenHelperPlantUMLIntegrationTONYYILingma前言IDEA里又很多好用的插件可以帮助我们提升开发效率,这里罗列下自己开发过程中常用的插件,善于利用插件,可以将自己的IDEA调教成自己中意的......
  • 前端(动态雪景背景+动态蝴蝶)
     1.CSS样式<style>html,body,a,div,span,table,tr,td,strong,ul,ol,li,h1,h2,h3,p,input{font-weight:inherit;font-size:inherit;list-style:none;border-spacing:0;border:0;border-collapse:......
  • 关系数据库标准语言SQL难题整理
    文章目录1、查询选修三门以上课程的学生学号2、查询选修课程中至多一门>70分的学生学号3、查询平均成绩>=90分的学生学号和平均成绩4、查询成绩都大于70分学生的成绩5、找出每个学生超过他自己选修课程平均成绩的课程号6、查询非计算机科学系某一个学生年龄小的学生姓名......
  • 过拟合(Overfitting)
    过拟合(Overfitting)是机器学习中的一个重要概念,它指的是模型在训练数据上表现得过于优秀,以至于在训练集上达到了很高的准确率,但在未见过的数据(测试集或实际应用中的数据)上表现却大幅下降的现象。这通常意味着模型学习到了训练数据中的噪声或细节,而非数据的通用规律。过拟合的原......
  • Python_matplotlib进阶
    Python_matplotlib跳转链接之前的博客中已经展示了使用python的matplotlib库进行一些基础图像的绘制,本篇进一步展示一些matplotlib中的一些进阶图像绘制。importpandasaspdimportmatplotlib.pyplotaspltplt.rcParams['font.sans-serif']=['SimHei']Titanic=......
  • 在排序数组中查找元素的第一个和最后一个位置
    34.在排序数组中查找元素的第一个和最后一个位置-力扣(LeetCode)题目描述给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1,-1]。你必须设计并实现时间复杂......
  • 掌握机器学习新星:使用Python和Scikit-Learn进行图像识别
    正文:        随着智能手机和社交媒体的普及,图像数据的生成速度比以往任何时候都快。为了自动化处理这些数据,我们需要强大的图像识别系统。机器学习提供了一种有效的方法来识别和分类图像中的对象。Scikit-Learn是一个流行的Python库,它提供了一系列用于数据挖掘和数据......
  • ctfshow--web7 sql注入空格过滤
    ?id=10//union//select//1,database(),3//%23查看库名查看表名-1/**/union/**/select/**/1,(select/**/group_concat(table_name)/**/from/**/information_schema.tables/**/where/**/table_schema=database()),3/**/%23查看flag表下的flag字段-1/**/union/**/select/**/1,(......
  • dubbo 统一异常处理
    依赖包pom.xml如下:<dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-registry-nacos</artifactId><version>3.0.4</version></dependency>dubbo服务:示例:@DubboService(interfaceClass=......
  • 计算几何进阶
    二维凸包模板题(luogu.P2742)凸包定义给定二维平面上的点集\(P\),定义能包含这些点的最小凸多边形为\(P\)的凸包。形象地说,凸包就是一根橡皮筋拉伸,使其包括了点集\(P\)中所有点,然后使橡皮筋收紧,橡皮筋就是\(P\)的凸包。例如,下面用红色线段表示了一个点集的凸包(原创图):凸......