小偷与守望者.math库.动态规划.贪心.C

news2025/1/18 6:29:59

1.分别讨论0或1;边界

2.写出递推方程;最优子结构、状态转移方程、重叠子问题

int rob(int* arr, int size){

    int dp[size];int result;

    if(size==0)return 0;

    if(size==1)return arr[0];

    else{

        dp[0]=arr[0];

        dp[1]=arr[1] > arr[0] ? arr[1]:arr[0];

        for (int i = 2; i < size; ++i) {

            dp[i]= dp[i-1]>arr[i]+dp[i-2] ? dp[i-1]:arr[i]+dp[i-2]; //注意arr 和 dp ;dp进入下一次递推

        }

        result=dp[size-1];

        return  result;

 低空间写法:

滚轮数组

int rob(int* nums, int numsSize) {
    int retVal = 0;

    if (numsSize == 0) {
        return retVal;
    } else if (numsSize == 1) {
        return nums[0];
    }

    int first = nums[0];
    int second = fmax(nums[0], nums[1]);
    int temp;
    int i;
    for (i = 2; i < numsSize; ++i) {
        temp = second;
        second = fmax(first + nums[i], second);
        first = temp;
    }
    retVal = second;

    return retVal;
}

 遍历修减

int rob(int* nums, int numsSize){
    if (numsSize == 1) {
        return *nums;
    }

    nums[1] = fmax(nums[0], nums[1]);
    for (int i = 2; i < numsSize; i++) {
        nums[i] = fmax(nums[i - 2] + nums[i], nums[i - 1]);
    }

    return fmax(nums[numsSize - 1], nums[numsSize - 2]);
}

函数fmax(x,y) 返回较大值;


自底向上的动态规划:

在青蛙跳阶问题中:一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 10 级的台阶总共有多少种跳法。

  • f(n-1)和f(n-2) 称为 f(n)  最优子结构
  • f(n)= f(n-1)+f(n-2)状态转移方程
  • f(1) = 1, f(2) = 2 边界
  • 比如f(10)= f(9)+f(8),f(9) = f(8) + f(7) ,f(8) 重叠子问题

 for循环从f(1)到f(10)即可;

1. 穷举分析

  • 当台阶数是1的时候,有一种跳法,f(1) =1
  • 当只有2级台阶时,有两种跳法,第一种是直接跳两级,第二种是先跳一级,然后再跳一级。即f(2) = 2;
  • 当台阶是3级时,想跳到第3级台阶,要么是先跳到第2级,然后再跳1级台阶上去,要么是先跳到第 1级,然后一次迈 2 级台阶上去。所以f(3) = f(2) + f(1) =3

2. 确定边界

通过穷举分析,我们发现,当台阶数是1的时候或者2的时候,可以明确知道青蛙跳法。f(1) =1,f(2) = 2

3. 找规律,确定最优子结构,写转移方程和code

一道动态规划问题,其实就是一个递推问题。假设当前决策结果是f(n),则最优子结构就是要让 f(n-k) 最优,最优子结构性质就是能让转移到n的状态是最优的,并且与后面的决策没有关系,即让后面的决策安心地使用前面的局部最优解的一种性质


 


 贪心

找局部最优:

int main() {
    long long m, s, t, i = 1;
    long long blink = 0, sum = 0;
    scanf("%lld %lld %lld", &m, &s, &t);
    while (i <= t) {
        sum = sum + 17;
        if (m >= 10) {
            blink = blink + 60;
            m = m - 10;
        } else
            m = m + 4;
        
        sum = fmax(sum, blink);
        if (s <= sum) {
            printf("Yes\n%lld", i);
            break;
        }
        i++;
    }
    if (i > t) {
        printf("No\n");
        printf("%d\n", sum);
    }
    return 0;
}

  • 建立数学模型来描述问题
  • 把求解的问题分成若干个子问题
  • 对每个子问题求解,得到子问题的局部最优解
  • 把子问题的解局部最优解合成原来问题的一个解

 前提是:局部最优策略能导致产生全局最优解。

贪心算法的实现框架


从问题的某一初始解出发:
while (朝给定总目标前进一步)
{
利用可行的决策,求出可行解的一个解元素。
}
由所有解元素组合成问题的一个可行解;

【背包问题】有一个背包,容量是M=150,有7个物品,物品可以分割成任意大小。要求尽可能让装入背包中的物品总价值最大,但不能超过总容量。
物品:A B C D E F G
重量:35 30 60 50 40 10 25
价值:10 40 30 50 35 40 30
分析:
目标函数: ∑pi最大
约束条件是装入的物品总质量不超过背包容量:∑wi<=M( M=150)
(1)根据贪心的策略,每次挑选价值最大的物品装入背包,得到的结果是否最优?
(2)每次挑选所占重量最小的物品装入是否能得到最优解?
(3)每次选取单位重量价值最大的物品,成为解本题的策略


 动态规划的设计,其实就是利用最优子结构和重叠子问题性质对穷举法进行优化,通过将中间结果保存在数组中,实现用空间来换取时间交换,实现程序的快速运行。(动态规划求解时,一般都会转化为网格进行求解,而且因为是空间换时间(避免了子问题的重复计算),因此一般迭代求解)。

动态规划具有两个性质:

1)重叠子问题

2)最优子结构

贪心算法:

1)贪心选择性质

2)最优子结构

解释一下,最优子结构性质是指问题的最优解包含其子问题的最优解时,就称该问题具有最优子结构性质,重叠子问题指的是子问题可能被多次用到,多次计算,动态规划就是为了消除其重叠子问题而设计的。其实贪心算法是一种特殊的动态规划,由于其具有贪心选择性质,保证了子问题只会被计算一次,不会被多次计算,因此贪心算法其实是最简单的动态规划。

考虑最值解,状态小规模问题的数学表示,状态转移方程(大规模问题如何转化为更小的问题),返回值

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

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

相关文章

php学习笔记-连接操作mysq数据库(基础)-day08

php学习笔记-连接操作mysq数据库-day08php中常用的mysql操作函数1.连接mysql服务器mysqli_connect()2.设置数据库字符集 和 发送sqlmysqli_query() 函数 可以用来设置数据库字符集。3.关闭mysql服务器连接mysqli_close();4.选择要操作的数据库mysqli_select_db()5.结果集释放my…

C#大型在线学习平台源码(PC端+手机端)

本套源码目录结构清晰、代码层次分明、文档齐全。源码分享&#xff01;需要源码学习可私信我获取。 系统简介 中小学教育平台是一个集学、练、考于一体的在线教育平台&#xff0c;可以帮助中小学教育机构建设网络课堂&#xff0c;用于同步课程、专题课堂、兴趣课堂等网络教育的…

当用户输入一堆这样的字符串到 Elasticsearch ?

1、问题引出如下样例数据已导入 Elasticsearch&#xff0c;如何实现特定字段检索&#xff1f;并计算出特定子字段的长度&#xff1f;"message": "[策略排序]排序后结果:[{\"intentItems\":[\"200001\"],\"level\":1,\"modul…

2021帆软杯一等奖 | 《游乐园综合管理系统》

# 作品主题——游乐园综合管理系统 #作品简介&#xff1a;该获奖作品来自零代码开发赛道。针对一些个人经营、没有统一规范的游乐园&#xff0c;希望通过创建一个简单、高效的系统应用&#xff0c;管理人员能够通过对表单的简单操作就能管理游乐园&#xff0c;如获取工作人员信…

程序分析-动态程序切片

最近在调研符号执行工具优化方式时&#xff0c;发现好几篇工作都用到了动态程序切片&#xff0c;以前大部分接触的都是静态切片&#xff0c;对动态切片几乎不了解。所以开始学习动态切片&#xff0c;我主要参考的是90年的一篇上古paper。 1.静态依赖图和静态切片 说到程序切片…

Obsidian Templater 批量新建笔记

Obsidian Templater 批量新建笔记 背景 工作中的新项目都有这么几个固定的笔记&#xff0c;比如项目背景、原理图设计、PCB设计、调试等&#xff0c;每个笔记文件又有一些固定的内容&#xff0c;想着在开始一个新项目时&#xff0c;一次性把这些笔记都建好&#xff0c;并且统…

一文教会你 如何在Github中创建仓库?如何将多个项目放到一个仓库中管理?如何将本地项目上传到GitHub中?

文章目录前言1、如何在GitHub中创建仓库1.1 点击New repository1.2 填写仓库的基本信息1.3 完成创建2 、克隆仓库地址到本地2.1 克隆地址2.2 克隆到本地2.3 将后端代码项目提交到远程服务器2.4 将前端代码项目提交到远程服务器3、Github上查看自己上传项目代码4、使用这个方式存…

【程序分析】Code Lifting

我理解&#xff0c;Code Lifting和反编译的概念类似 常规的编译过程是这样的&#xff1a; 这是一个从高级形式到低级形式的过程&#xff0c;一般叫做 lowering 而反编译&#xff0c;是这样一个过程&#xff1a; 这个过程是完全相反的&#xff0c;叫做lifting 需要注意 Bi…

FPGA:逻辑函数的卡诺图化简法

文章目录最小项与最小项表达式最小项的定义最小项的性质逻辑函数的最小项表达式卡诺图化简法用卡诺图表示逻辑函数卡诺图的引出两变量卡诺图三变量卡诺图四变量卡诺图已知逻辑函数真值表&#xff0c;画卡诺图已知逻辑函数画卡诺图用卡诺图化简逻辑函数化简的依据化简的步骤用卡…

Hexo + Butterfly 侧边栏公众号

原文链接 &#xff1a;Hexo Butterfly 侧边栏公众号 推荐阅读 基于 Hexo 从零开始搭建个人博客&#xff08;一&#xff09;: 环境准备基于 Hexo 从零开始搭建个人博客&#xff08;二&#xff09;: 项目初识基于 Hexo 从零开始搭建个人博客&#xff08;三&#xff09;: 主题安…

Lichee_RV学习系列--stream移植

Lichee_RV学习系列文章目录 Lichee_RV学习系列—认识Lichee Rv Dock、环境搭建和编译第一个程序 Lichee_RV学习系列—移植dhrystone 文章目录Lichee_RV学习系列文章目录一、stream简介二、源码下载三、文件移植1、makefile文件编译makefile文件移植四、运行结果五、移植过程中…

【尚硅谷】Java数据结构与算法笔记08 - 查找算法

文章目录一、查找算法介绍二、线性查找算法三、二分查找算法3.1 思路分析3.2 代码实现四、插值查找算法4.1 思路分析4.2 代码实现4.3 注意事项五、斐波那契&#xff08;黄金分割法&#xff09;查找算法5.1 思路分析5.2 原理讲解5.3 代码实现一、查找算法介绍 在 java 中, 我们…

C++多线程入门及基础知识

什么是C多线程 线程即操作系统进行CPU任务调度的最小单位。C的多线程并发&#xff0c;简单理解的话就是&#xff0c;将任务的不同功能交由多个函数实现&#xff0c;创建多个线程&#xff0c;每个线程执行一个函数&#xff0c;一个任务就同时由不同线程执行。 什么时候使用多…

微信小程序:骨架屏的实现方法

骨架屏是为了展示一个页面骨架而不含有实际的页面内容&#xff0c;从渲染效率上来讲&#xff0c;骨架屏它并不能使首屏渲染加快。由于骨架屏的一些使用又向用户渲染了额外的一些内容&#xff0c;这些内容是额外添加的、本来是不需要渲染的&#xff0c;它反而从整体上加长了首屏…

Windows 虚拟磁盘驱动开发(采用原始办法实现类似Storport框架的相同功能)

其实以前讲述windows平台下的磁盘驱动的开发挺多&#xff0c;而且时间也是非常早。以下连接&#xff1a;https://blog.csdn.net/fanxiushu/article/details/9903123?spm1001.2014.3001.5501https://blog.csdn.net/fanxiushu/article/details/11713357?spm1001.2014.3001.5501…

游戏开发 状态同步

【状态同步】1、将所有的操作发送给Server&#xff08;T1&#xff09;&#xff0c;由Server计算&#xff08;T2&#xff09;&#xff0c;并返回结果&#xff08;T3&#xff09;。权威服务器架构能够防止很多的作弊&#xff0c;但是直接用这种方法会让游戏的响应变得迟缓。如果 …

three games 之 桌球

接下来介绍一些 Vue4 中的一些进阶使用&#xff0c;希望对大家有所帮助&#xff0c;谢谢。 如果文中有不对、疑惑的地方&#xff0c;欢迎在评论区留言指正&#x1f33b; 一、项目结构 Vuex 并不限制你的代码结构。但是&#xff0c;它规定了一些需要遵守的规则&#xff1a; …

移动硬盘怎么分区?

硬盘分区指的是硬盘上被划分出来的区块&#xff0c;可用于分类存储各种数据。而我们日常购买的移动硬盘通常来说分为两种&#xff0c;一种是买回来已分好区的&#xff0c;还有一种是未经过分区的。如果移动硬盘没有经过分区&#xff0c;那么在将它连接到电脑的USB接口时&#x…

android四大组件之四-BroadCast实现原理分析

前言&#xff1a; 一开始的目标是解决各种各样的ANR问题的&#xff0c;但是我们知道&#xff0c;ANR总体上分有四种类型&#xff0c;这四种ANR类型有三种是和四大组件相对应的&#xff0c;所以&#xff0c;如果想了解ANR发生的根因&#xff0c;对安卓四大组件的实现原理必须要…

伙伴云与飞书、金山办公一同入选亿欧2022中国数字化企业服务商TOP50

近日&#xff0c;由中关村国家自主创新示范区展示中心、中关村会展与服务产业联盟与亿欧联合举办的SHOWTECH2022-WIM 创新者年会”在京顺利召开&#xff0c;会上&#xff0c;亿欧网重磅发布《2022世界创新奖榜单》。伙伴云凭借10年来为企业数字化转型赋能的成功经验和卓越贡献&…