【算法篇】动态规划(一)

news2024/12/26 9:32:11

文章目录

      • 拆分字符串
      • 三角形最小路径和
      • 不同路径
      • 最小路径和
      • 背包问题

在这里插入图片描述

class Solution {
public:
    int fib(int n) {
        // if(n==0)
        // {
        //     return 0;
        // }
        // if(n==1||n==2)
        // {
        //     return 1;
        // }
        // return fib(n-1)+fib(n-2);

        //上面的方法会发现时间复杂度太大,超出时间限制O(2^n)
        /
        //创建一个数组,保留中间状态的解
        
        // int* F=new int[n+2];
        // int MOD = 1000000007;
        // //初始化fib(0),fib(1)
        // F[0]=0;
        // F[1]=1;
        // //创建方程 f(n)=f(n-1)+f(n-2);
        // for(int i=2;i<=n;++i)
        // {
        //     F[i]=(F[i-1]+F[i-2])%MOD;
        // }
        // //返回结果
        // int result=F[n];
        // delete[] F;
        // return result;
        /

        //上面的方法还是可以继续优化的,空间复杂度还可以大幅度优化
        int fib;
        int MOD = 1000000007;
        int fib1=0;
        int fib2=1;
        if(n==0)
        {
            return 0;
        }
        if(n==1)
        {
            return 1;
        }
        for(int i=2;i<=n;i++)
        {
            fib=(fib1+fib2)%MOD;
            fib1=fib2;
            fib2=fib;
        }
        return fib;

    }
};

拆分字符串

在这里插入图片描述

class Solution {
public:
    bool wordBreak(string s, unordered_set<string> &dict) {
         int len=s.length();
         vector<bool> dp(len+1,false);
        dp[0]=true;//初始

         for(int i=1;i<=len;i++)
         {
            for(int j=i-1;j>=0;j--)
            {    //利于遍历,它的意义和下面的dp[i]=true是相关联的只有上一个为true,才会出现下一个
         //这也就是为什么在最后取true,就能保证前面的单词也在字典当中,最少是一个整体,因为开始有个true
                if(dp[j]&&dict.find(s.substr(j,i-j))!=dict.end())//公式
                {//注意上面的执行顺序,要确定dict当中有之后才进行的!=比较
                    dp[i]=true;
                    break;
                }
            }
         }
         return dp[len];
    }
};

三角形最小路径和

在这里插入图片描述

//第一种写法,是从上往下进行
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param triangle int整型vector<vector<>> 
     * @return int整型
     */
    int minTrace(vector<vector<int> >& triangle) {
        // write code here
        if(triangle.empty())
        {
            return 0;
        }
        int row=triangle.size();//行
        //int col=triangle[0].size();//列
        //这里的列只是求的是第一行的数值,所以就导致最后的遍历需要使用row
        //他是个等腰直角三角形,所以行和列是相等的
        for(int i=1;i<row;i++)
        {   //要注意区分j==0,j==i
            for(int j=0;j<=i;j++)
            {
                if(j==0)
                {
                    triangle[i][j]=triangle[i-1][j]+triangle[i][j];
                }
                else if(j==i)
                {
                    triangle[i][j]=triangle[i-1][j-1]+triangle[i][j];
                }
                else {
                    triangle[i][j]=min(triangle[i-1][j],triangle[i-1][j-1])+triangle[i][j];
                }
            }
        }
        //将每一列的嘴小结果放到最后一行,最后间进行比较

        int mintri=triangle[row-1][0];
        for(int i=1;i<row;i++)
        {
            mintri=min(mintri,triangle[row-1][i]);
        }

        return mintri;
    }
};
//第二种写法,是从下往上进行
class Solution {
public:
    int minimumTotal(vector<vector<int>>& triangle) {
        if(triangle.empty())
        {
            return 0;
        }
        int row=triangle.size();//行
        //int col=triangle[0].size();//列
        //从倒数第二行开始,自下往上
        //在倒数第二行的的情况下进行向下查找较小数值(倒一),到三找倒二较小的值
        for(int i=row-2;i>=0;i--)
        {
            for(int j=0;j<=i;j++)
            {
                triangle[i][j]=min(triangle[i+1][j],triangle[i+1][j+1])+triangle[i][j];
            }
        }

        return triangle[0][0];
    }
};

不同路径

在这里插入图片描述

class Solution {
public:
    int uniquePaths(int m, int n) {
        vector<vector<int>> f(m, vector<int>(n));
        //先进行初始化只要是在第一行或者第一列上的都进行初始化为1
        for (int i = 0; i < m; ++i) {
            f[i][0] = 1;
        }
        for (int j = 0; j < n; ++j) {
            f[0][j] = 1;
        }
        //f[i][j] = f[i - 1][j] + f[i][j - 1];转移方程
        //因为只能向下或者向右,所以就是 f[i - 1][j] ,f[i][j - 1]这两个位置的和
        for (int i = 1; i < m; ++i) {
            for (int j = 1; j < n; ++j) {
                f[i][j] = f[i - 1][j] + f[i][j - 1];
            }
        }
        return f[m - 1][n - 1];
    }
};

最小路径和

在这里插入图片描述

class Solution {
public:
    int minPathSum(vector<vector<int>>& grid) {
         if (grid.size() == 0 || grid[0].size() == 0) {
            return 0;
        }
        
        int row =grid.size();
        int col=grid[0].size();

        for(int i=1;i<row;i++)
        {
            grid[i][0]+=grid[i-1][0];
        }

        for(int j=1;j<col;j++)
        {
            grid[0][j]+=grid[0][j-1];
        }

        for(int i=1;i<row;i++)
        {
            for(int j=1;j<col;j++)
            {
                grid[i][j]+=min(grid[i-1][j],grid[i][j-1]);
            }
        }

        return grid[row-1][col-1];
    }
};

背包问题

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

//上面图片的红色部分是用来初始化的,
//int tmp_best = value[i - 1] + dp[i - 1][j - capacity[i - 1]];
//dp[i][j] = max(tmp_best, dp[i - 1][j]);
//通过上面的代码进行比较来判断是否需要继承上一行的值,或者创造出更大的值
#include <iostream>
#include<vector>
using namespace std;

int main() {
    int N, V;
    while (cin >> N >> V) {
        vector<int> value(N);//存储每个物品的价值
        vector<int> capacity(N);//存储每个物品的容量
        for (int i = 0; i < N; ++i) {
            cin >> value[i] >> capacity[i];
        }
        vector<vector<int>> dp(N + 1, vector<int>(V + 1, 0));
        //有N+1行,但是从1开始遍历,所以每行表示每个物品
        //有V+1列,但是从1开始遍历,所以每列表示从1开始到最大容量 的 各种情况下 的 物品最大价值存储
        for (int i = 1; i < N + 1; ++i) {
            for (int j = 1; j < V + 1; ++j) {
                if (capacity[i - 1] > j) { //如果不下,那就等于上次的最优存储
                    //这里的capacity[i-1]是因为这里的i从1开始
                    dp[i][j] = dp[i - 1][j];
                } else //如果能放下,有两种情况:1、放 2、不放
                    //放和不放取决于放了之后是否是最优的,于是创建一个临时变量。
                {
                    //dp[i-1][j-capacity[i-1]]:i-1:上面一行,j-capacity[i-1]:装了i-1这个物品之后还剩的容量。所以整体就是:当前的tmp_best == 装了i-1物品的价值 + 装了这个物品后剩余的容量还可以装的最优的方案
                    int tmp_best = value[i - 1] + dp[i - 1][j - capacity[i - 1]];
                    dp[i][j] = max(tmp_best, dp[i - 1][j]);
                }
            }
        }
        //返回最后一个元素就是最优的方案
        cout << dp[N][V] << endl;
    }
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/954117.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

今天使用python进行开发

前言&#xff1a;相信看到这篇文章的小伙伴都或多或少有一些编程基础&#xff0c;懂得一些linux的基本命令了吧&#xff0c;本篇文章将带领大家服务器如何部署一个使用django框架开发的一个网站进行云服务器端的部署。 文章使用到的的工具 Python&#xff1a;一种编程语言&…

EOCR-SE2/EOCRSE2在数控技术行业的应用

EOCR-SE2电动机保护器是施耐德EOCR系列中一款以低成本、高性能著称的产品&#xff0c;其广泛应用于各种机床设备中。 EOCRSE2-05RS品牌&#xff1a;施耐德&#xff0c;产地&#xff1a;韩国益山工厂&#xff0c;型号&#xff1a;EOCR-SE2,电流范围&#xff1a;3-30A&#xff0…

如果应对2023年国赛

国赛倒计时一周&#xff0c;大家多看看优秀论文&#xff0c;赛前多思考&#xff0c;使大脑在活跃状态&#xff0c;更好的应对题目。 需要历年游戏论文的小伙伴可私信我&#xff0c;或关注微信公众号私信我

机器学习基础16-建立预测模型项目模板

机器学习是一项经验技能&#xff0c;经验越多越好。在项目建立的过程中&#xff0c;实 践是掌握机器学习的最佳手段。在实践过程中&#xff0c;通过实际操作加深对分类和回归问题的每一个步骤的理解&#xff0c;达到学习机器学习的目的 预测模型项目模板 不能只通过阅读来掌握…

恒运资本:概念股是什么意思

概念股是指在特定的经济布景、方针环境、职业远景或社会热点等方面具有某种特别的发展远景和投资价值的股票。在投资者心目中&#xff0c;概念股的危险较大&#xff0c;可是或许带来高于商场平均水平的收益率。那么&#xff0c;概念股到底是什么意思&#xff1f;在本文中&#…

vue3 +element-plus中避免一打开表单的下拉选择的change事件自动校验问题

背景&#xff1a;新增和编辑共用一个弹窗时&#xff0c;每次打开新增弹窗&#xff0c;el-select的表单项会触发change事件的自动校验。我这里的下拉选择是支持多选的&#xff0c;也就是属性上有multiple。 以下解决方法&#xff0c;亲测有用&#xff01;&#xff01; 1. 该表…

【运维】hadoop3.0.3集群安装(一)多节点安装

文章目录 一.Purpose二. Prerequisites三. Installation1. 节点规划2. Configuring Hadoop in Non-Secure Mode3. 准备工作4. 配置core-site.xmlhdfs-site.xmlyarn-site.xmlmapred-site.xmlworkers 4. 分发配置、创建文件夹5. 格式化6. 操作进程6.1. hdfs启动停止 6.2. yarn启动…

华为Mate60 麒麟5G归来,B站都燃了

8月29日&#xff0c;B站华为官方号“华为终端”&#xff0c;发布作品《【HUAWEI Mate 60系列】致敬奔腾不息的力量》公布了华为Mate 60系列产品面世。 该作品一经发布后&#xff0c;一小时最高能增长45.1万的播放量&#xff0c;截至目前发布两日播放量已经高达316.9万&#xf…

关于vue3组合式api (父组件和子组件之间的数据传递)笔记

目录 1.父组件转子组件 2.子组件传父组件 1.父组件转子组件 直接上代码 运行结果 2.子组件传父组件 子组件向父组件传递数据较为复杂一些&#xff0c;需要加深理解才可以明白&#xff01;我是这样理解的 父组件先写一个带参的函数&#xff0c;然后再将函数传给子组件&#xf…

Acwing793. 高精度乘法

Acwing793. 高精度乘法 题目描述代码展示 题目描述 代码展示 #include <iostream> #include <vector>using namespace std;vector<int> mul(vector<int> &A, int b) {vector<int> C;int t 0;for (int i 0; i < A.size() || t; i ){if…

一文通关MyBatisPlus

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; MyBatis ✨特色专栏&#xff1a; MySQ…

ssm园区停车管理系统源码和论文

ssm园区停车管理系统源码和论文104 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 摘 要 网络技术和计算机技术发展至今&#xff0c;已经拥有了深厚的理论基础&#xff0c;并在现实中进行了充分运用&#x…

keytool生成证书

配置jdk 下载jdk https://www.oracle.com/java/technologies/downloads/#java8-linux 解压文件 tar -xvf jdk-8u381-linux-x64.tar.gz配置环境变量 export PATH$PATH:/root/jdk1.8.0_381/bin注意&#xff1a;此处仅配置了建议环境变量&#xff0c;若需要配置jdk完整环境变量&…

Blender 围绕自身的原点旋转与游标旋转

默认情况下的旋转是&#xff0c;R后旋转是物体自身的原点旋转 可以修改为围绕游标旋转&#xff0c;通过旋转R时 局部与全局坐标 全局的坐标不会变 局部的会随着物体的旋转变化 如果平稳时GZZ会在全局到局部坐标之间切换 或在局部到全局之间的切换 学习视频&#xff1a;【基础…

OCR文字检测与识别系统:融合文字检测、文字识别和方向分类器的综合解决方案

1. PP-OCR系统简介与总览 前两章主要介绍了DBNet文字检测算法以及CRNN文字识别算法。然而对于我们实际场景中的一张图像&#xff0c;想要单独基于文字检测或者识别模型&#xff0c;是无法同时获取文字位置与文字内容的&#xff0c;因此&#xff0c;我们将文字检测算法以及文字…

算法通关村第9关【黄金】| 两道有挑战的问题

1. 将有序数组转换为二叉搜索树 思路&#xff1a;二分法&#xff0c;这个算法保证了每次选择的中间元素都能保持左右子树的高度差不超过 1&#xff0c;从而构建一个高度平衡的二叉搜索树。这个过程类似于分治法&#xff0c;通过递归不断将大问题分解成小问题并解决。 找到数组…

和24考研说拜拜,不考研读中外合作办学硕士——人大女王金融硕士

23考研失利同学&#xff0c;大多都会有这样的疑虑&#xff0c;是再试一次还是选择其他方式呢&#xff1f;其实&#xff0c;并不用执着于全国联考&#xff0c;中外合作办学硕士或许更适合你。近年来&#xff0c;经济迅速发展&#xff0c;经济全球化不断扩大&#xff0c;金融方向…

怪兽充电连续两季度盈利,共享充电宝又行了?

智能手机的时代&#xff0c;“电量焦虑”是一个从未得到完美解决的问题。 彼得戴曼迪斯在《创业无畏》中写下&#xff1a;“世界上最大的问题等于最大的商机。” 近期&#xff0c;科技消费公司怪兽充电发布了2023年第二季度业绩报告。根据财报&#xff0c;怪兽充电第二季度实…

云计算中的负载均衡技术,确保资源的平衡分配

文章目录 1. 硬件负载均衡器2. 软件负载均衡器3. DNS负载均衡4. 内容分发网络&#xff08;CDN&#xff09; &#x1f388;个人主页&#xff1a;程序员 小侯 &#x1f390;CSDN新晋作者 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 ✨收录专栏&#xff1a;云计算 ✨文章内…

【锁】定时任务推送数据-redission加锁实例优化

文章目录 redission 加锁代码-有问题优化代码看门狗是什么&#xff1f; redission 加锁代码-有问题 /*** 收货入库物料标签(包装码)推送接口** throws Exception*/public void synReceiveMaterialTags() throws Exception {String tag DateFormatUtils.format(new Date(), &qu…