【蓝桥每日一题]-动态规划 (保姆级教程 篇10)#方格取数

高能预警:讲了这么久动态规划了,该上点有难度的题吧

目录

题目:方格取数

 思路(解法一):

 解法二:


题目:方格取数

        

 思路(解法一):

如果只有两个方向的话,动态规划就很简单了,因为很容易就能根据已确定点推出未确定点(因为每个未知点都可以由上方和左方的已知点推出)。但是三个方向就不行了,因为全是未确定点。

     
既然这样的话我们就设置  up[i][j],down[i][j] 分别代表从下面向上面走到(i,j),从上面向下面走到(i,j)能取到的最大值;f[i][j]表示(i,j)处最终可取到的最大值

   
转移方程就好写了:

     

up[i][j]=max(up[i+1][j],f[i][j-1])+a[i][j];//可以从两个方向过来

down[i][j]=max(down[i-1][j],f[i][j-1])+a[i][j];//同理

 f[i][j]=max(up[i][j],down[i][j]);//取最大值呀

     

因为数据比较大,所以我们要压缩成一维(因为我们在状态转移的时候只用到了j-1列的数据,故可以降一维,只需我们把列放外面即可。不明白的可以看动归最开始讲的那里)

    

故得到://这个f[i]是上一列的,初始化时候别搞错了

    
up[i]=max(up[i+1],f[i])+a[i][j];

down[i]=max(down[i-1],f[i])+a[i][j];

f[i]=max(up[i],down[i])  
     

       

#include <bits/stdc++.h>  //(单向)方格取数
using namespace std;//动态规划
int n,m,a[1001][1001];
long long up[1005],down[1005],f[1005];
int main(){cin>>n>>m;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)cin>>a[i][j];f[1]=a[1][1];for(int i=2;i<=n;i++) f[i]=f[i-1]+a[i][1];//初始化第一列的每行for(int j=2;j<m;j++){//每次用上一列的数据memset(down,0,sizeof(down));//我们只需要关注行的数据即可,故需要循环一次初始化一次memset(up,0,sizeof(up));down[1]=f[1]+a[1][j];up[n]=f[n]+a[n][j];for(int i=2;i<=n;i++) down[i]=max(f[i],down[i-1])+a[i][j];for(int i=n-1;i>=1;i--) up[i]=max(f[i],up[i+1])+a[i][j];for(int i=1;i<=n;i++) f[i]=max(down[i],up[i]);//因为每列要么只向上,要么只向下,故取优即可}f[1]+=a[1][m];//因为最后一列只能向下走,故单独处理for(int i=2;i<=n;i++) f[i]=max(f[i],f[i-1])+a[i][m];//向下处理printf("%lld",f[n]);return 0;
}

       

解法二:

都说dp不好理解,那就再来个dfs吧

    

我们设置 f(i, j, 0)表示从下面走到该各格子(i, j)对应最优解,f(i, j, 1)表示从上面走到该格子对应最优解。

那么递推公式:

f(i,j,0)=max(f(i+1,j,0),f(i,j-1,0),f(i,j-1,1))
f(i,j,1)=max(f(i-1,j,1),f(i,j-1,0),f(i,j-1,1))

   
  这样的话一共只需要跑n*m*2即可获得所有结果,所以和dp一样快
   

    

#include <stdio.h>
typedef long long LL;  //记忆化搜索(和dp一样快)
const LL min_ll=-1e18;
int n,m;
LL w[1005][1005],f[1005][1005][2];
inline LL mx(LL p,LL q,LL r) {return p>q ? (p>r ? p:r) : (q>r ? q:r);}//三叶判断最快
inline LL dfs(int x, int y, int from) {if (x<1 || x>n || y<1 || y>m) return min_ll;if (f[x][y][from] != min_ll) return f[x][y][from];//记忆化if (from == 0) f[x][y][from] = mx(dfs(x+1,y,0), dfs(x,y-1,0), dfs(x,y-1,1))+w[x][y];else f[x][y][from] = mx(dfs(x-1,y,1), dfs(x,y-1,0), dfs(x,y-1,1))+w[x][y];return f[x][y][from];
}
int main(void) {scanf("%d %d", &n, &m);for (int i=1; i<=n; ++i)for (int j=1; j<=m; ++j) {scanf("%lld", &w[i][j]);f[i][j][0]=f[i][j][1]=min_ll;}f[1][1][0]=f[1][1][1]=w[1][1];//标记终点的值,到这个状态就直接返回,也就是dfs的结束条件printf("%lld\n",dfs(n,m,1));return 0;
}

好,那么好,如果你能看到这里,那么你真的很厉害了已经,下面讲双向类型的。

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

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

相关文章

SpringMVC的工作流程

1、SpringMVC的定义 Spring MVC是基于Java的开源Web框架&#xff0c;它是Spring框架的一部分&#xff0c;用于构建MVC&#xff08;Model-View-Controller&#xff09;模式的Web应用程序。它提供了一种灵活且强大的方式来开发Web应用程序&#xff0c;并将应用程序的不同层进行解…

python 之 矩阵相关操作

文章目录 1. **创建矩阵**&#xff1a;2. **矩阵加法**&#xff1a;3. **矩阵乘法**&#xff1a;4. **矩阵转置**&#xff1a;5. **元素级操作**&#xff1a;6. **汇总统计**&#xff1a;7. **逻辑操作**&#xff1a; 理解你的需求&#xff0c;我将为每个功能写一个单独的代码块…

docker部署与基础操作

目录 一、Docker 概述&#xff1a; 1. docker简介&#xff1a; 2. 容器的优点&#xff1a; 3. 容器在内核中支持2种重要技术&#xff1a; 4 . 容器与虚拟机 的区别&#xff1a; 5. docker三个核心概念&#xff1a; 二、安装docker&#xff1a; 1. 关闭防火墙&#xff1a; 2. 安…

使用MFC创建一个SaleSystem

目录 1、项目的创建&#xff1a; 2、项目的配置&#xff1a; 3、设置窗口属性&#xff1a; &#xff08;1&#xff09;、设置图标 1&#xff09;、添加导入资源 2&#xff09;、代码初始化图标 &#xff08;2&#xff09;、设置标题 &#xff08;3&#xff09;、设置窗口…

2023-10-22 LeetCode每日一题(做菜顺序)

2023-10-22每日一题 一、题目编号 1402. 做菜顺序二、题目链接 点击跳转到题目位置 三、题目描述 一个厨师收集了他 n 道菜的满意程度 satisfaction &#xff0c;这个厨师做出每道菜的时间都是 1 单位时间。 一道菜的 「 like-time 系数 」定义为烹饪这道菜结束的时间&am…

【C++】特殊类实现

一、请设计一个类&#xff0c;不能被拷贝 拷贝只会放生在两个场景中&#xff1a;拷贝构造函数以及赋值运算符重载&#xff0c;因此想要让一个类禁止拷贝&#xff0c; 只需让该类不能调用拷贝构造函数以及赋值运算符重载即可。 C98 将拷贝构造函数与赋值运算符重载只声明不定义…

美团面试:Oracle JDK那么好,为何要用Open JDK?

说在前面 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业如阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格&#xff0c;遇到很多很重要的面试题&#xff1a; 既然 Oracle JDK 这么好&#xff0c;那为什么还要有 OpenJDK&…

【Java基础面试三十八】、请介绍Java的异常接口

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;请介绍Java的异常接口 …

【Linux】基本操作指令汇总(不完全)

文章目录 操作系统概念补充lspwdsuechocdtouchmkdirrmdir指令 && rm 指令(重要)man指令cpmvcatmorelessheadtailstat时间相关的指令calfindgrepwcsortuniqwhichziptar:打包/解包&#xff0c;不打开它&#xff0c;直接看内容bcunamectrl cctrl rctrl d\ls cpulsmemdf-hw…

Android C/C++ native编程NDK开发中logcat的使用

Android C/C native编程NDK开发中logcat的使用 前言具体用法 前言 在NDK开发过程中&#xff0c;C/C层&#xff0c;需要对代码进行一些调试&#xff0c;日志打印是我们解决异常或崩溃的重要手段&#xff0c;这里我就简单介绍下日志打印三步走。 首先我们先看下官方文档关于日志…

一天吃透Java面试题

给大家分享我整理的Java高频面试题&#xff0c;有小伙伴靠他拿到字节offer了。 Java基础面试题 Java的特点Java 与 C 的区别JDK/JRE/JVM三者的关系Java程序是编译执行还是解释执行&#xff1f;面向对象和面向过程的区别&#xff1f;面向对象有哪些特性&#xff1f;数组到底是…

npm常用命令与操作篇

npm简介 npm是什么 npm 的英文是&#xff0c;node package manager&#xff0c;是 node 的包管理工具 为什么需要npm 类比建造汽车一样&#xff0c;如果发动机、车身、轮胎、玻璃等等都自己做的话&#xff0c;几十年也做不完。但是如果有不同的厂商&#xff0c;已经帮我们把…

信息检索与数据挖掘 | (五)文档评分、词项权重计算及向量空间模型

目录 &#x1f4da;词项频率及权重计算 &#x1f407;词项频率 &#x1f407;逆文档频率 &#x1f407;tf-idf权重计算 &#x1f4da;向量空间模型 &#x1f407;余弦相似度 &#x1f407;查询向量 &#x1f407;向量相似度计算 &#x1f4da;其他tf-idf权值计算方法 …

Jmeter —— jmeter参数化实现

jmeter参数化 在实际的测试工作中&#xff0c;我们经常需要对多组不同的输入数据&#xff0c;进行同样的测试操作步骤&#xff0c;以验证我们的软件的功能。这种测试方式在业界称为数据驱动测试&#xff0c; 而在实际测试工作中&#xff0c;测试工具中实现不同数据输入的过程称…

数据库管理-第112期 Oracle Exadata 03-网络与ILOM(20231020)

数据库管理-第112期 Oracle Exadata 03-网络与ILOM&#xff08;202301020&#xff09; 在Exadata中&#xff0c;除了对外网络以外&#xff0c;其余网络都是服务于一体机内部各组件的网络&#xff0c;本期对这些网络的具体情况和硬件管理相关做一个讲解。 1 网络分类 1.1 生产…

企业知识库软件,快速构建企业知识分享与团队协同的软件

企业知识库是一种特殊的在线协同文档工具&#xff0c;支持包括FAQ、文档、视频、知识图谱等。从本质上讲&#xff0c;它是基于企业知识库软件从而实现内部或外部知识的沉淀、集合、更新、共享等&#xff0c;能为员工或客户提供常见问题的标准回答。 今天我就基于HelpLook &…

敏捷是怎么提高工作效率的

敏捷管理是一门极力减少不必要工作量的艺术。 谷歌、亚马逊、苹果、微信、京东等全球 500 强企业都在用的管理方法&#xff0c;适用于各行各业&#xff0c;被盛赞为应获“管理学的诺贝尔奖”。 它专注于让员工不受种种杂事的羁绊&#xff0c;激发个体斗志&#xff0c;释放出巨大…

阶段六-Day05-MyBatis3

一、多表查询&#xff08;面试题&#xff09; 1. 介绍 多表查询是在企业中必不可少的&#xff0c;无论多么简单的项目里通常会出现多表查询的操作。因为只要是关系型数据库&#xff0c;在设计表时都需要按照范式进行设计&#xff0c;为了减少数据冗余&#xff0c;都会拆成多个…

Proteus仿真--量程自动切换数字电压表(仿真+程序)

本文主要介绍基于51单片机的量程自动切换数字电压表Proteus仿真设计&#xff08;完整仿真源文件及代码见文末链接&#xff09; 简介 硬件电路主要分为单片机主控模块、AD转换模块、量程选择模块以及数码管显示模块 &#xff08;1&#xff09;单片机主控模块&#xff1a;单片…