Acwing算法提高课-DP-数字三角形模型

摘花生

见另一篇文章:

Acwing数学与简单DP(二)

最低通行费

原题链接:https://www.acwing.com/problem/content/1020/

类似于上面的摘花生,不过摘花生求的是集合的MAX,最低通行费求的是集合的MIN。
但是,由于数组初始化为0。不能像摘花生一样简单的max()
最后一步,可能是从上方走来的,也可能是从左方走来的。
对于除第一行和第一列的元素来说,确实可以用min(上来,左来)求较小值。
但对于处理边界元第一行和第一列时,以第一行为例:

  • 从上方结果是0。通行费大于一,min的值一定是0

可不可以加一个特判呢?

  • 第一行的时候,当前位置的值等于左来方式的值。
  • 第一列的时候,当前位置的值等域上来方式的值。
  • 其余情况,当前位置的值等于两种方式中的较小值。

思路比较清晰,但写起来其实挺麻烦的。下面是另一种写法,用一个新的表,增加了空间,但简化了写法。

  • 状态表示:f[i][j]左上角走到第i行第j列的最低通行费。
  • 集合属性:MIN
  • 状态计算:最后一步划分为从左来和从上来。
#include"bits/stdc++.h"using namespace std;int N;
int w[110][110];
int dp[110][110];int main() {cin >> N;for (int i = 1; i <= N; i++) {for (int j = 1; j <= N; j++) {scanf("%d", &w[i][j]);}}for (int i = 1; i <= N; i++) {for (int j = 1; j <= N; j++) {if (i == 1 && j == 1)dp[i][j] = w[i][j];else {dp[i][j] = 1e9;if (i > 1)dp[i][j] = min(dp[i][j], dp[i - 1][j] + w[i][j]);if (j > 1)dp[i][j] = min(dp[i][j], dp[i][j - 1] + w[i][j]);}}}printf("%d\n", dp[N][N]);return 0;
}

上面代码的思路是特判左上角。
只有不在第一行的时候,才可以从上面过来。
只有不再第一列的时候,才可以从左边过来。

方格取数

原题链接:https://www.acwing.com/problem/content/1029/

摘花生中,只走一次的情况:

  • f[i][j]表示所有从(1,1)(i,j)的路径的最大值。
  • f[i][j]=max(f[i-1][j],f[i][j-1])+w[i][j]

走两次:
f[i1][j1][i2][j2]表示所有从(1,1),(1,1)分别走到(i1,j1),(i2,j2)的路径的最大值。
如何处理“同一格子不能被重复选择”:

  • 只有在i1+j1==i2+j2时,两条路径的格子才可能重合

状态表示:f[k][i1][i2]表示所有从(1,1),(1,1)分别走到(i,k-i1),(i2,k-i2)的路径的最大值。
k表示两条路线当前走过的格子的横纵坐标之和。

  • k=i1+j1=i2+j2

属性:MAX
状态计算:f[k][i1][i2]=max(f[k - 1][i1 - 1][i2 - 1],f[k - 1][i1 - 1][i2],f[k - 1][i1][i2 - 1],f[k - 1][i1][i2])+t

  • 最后一步的第一条路线可以从上来、左来:max(f[k - 1][i1-1][*],f[k - 1][i1][*])
  • 最后一步的第二条路线可以从上来、左来:max(f[k - 1][*][i2-1],f[k - 1][*][i2])
#include"bits/stdc++.h"using namespace std;int n;
int w[15][15];
int f[30][15][15];int main() {cin >> n;int a, b, c;while (cin >> a >> b >> c, a || b || c)w[a][b] = c;for (int k = 2; k <= n + n; k++) {for (int i1 = 1; i1 <= n; i1++) {for (int i2 = 1; i2 <= n; i2++) {int j1 = k - i1, j2 = k - i2;if (j1 >= 1 && i1 <= n && j2 >= 1 && j2 <= n) {int t = w[i1][j1];if (i1 != i2)t += w[i2][j2];int &x = f[k][i1][i2];x = max(x, f[k - 1][i1 - 1][i2 - 1] + t);x = max(x, f[k - 1][i1 - 1][i2] + t);x = max(x, f[k - 1][i1][i2 - 1] + t);x = max(x, f[k - 1][i1][i2] + t);}}}}cout << f[2 * n][n][n];return 0;
}

在while中,判断结束的方法是,后位操作。

传纸条

原题链接:https://www.acwing.com/problem/content/277/

状态表示f[k][x1][x2]:所有第一条从(1,1)走到(x1,k-x1)和第二条从(1,1)走到(x2,k-x2)的路线的最大好心程度之和。
属性:MAX
状态计算:

  • 最后一步的两条路线分别有两种来法:从上来、从左来。
  • 最后一步的位置可能相同:t = w[x1][k - x1]
  • 最后一步的位置可能不同:t = w[x1][k - x1] + w[x2][k - x2]
#include"bits/stdc++.h"using namespace std;int n, m;
int w[55][55];
int f[110][55][55];int main() {cin >> n >> m;for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {cin >> w[i][j];}}for (int k = 2; k <= m + n; k++) {for (int x1 = max(1, k - m); x1 <= min(k - 1, n); x1++) {for (int x2 = max(1, k - m); x2 <= min(k - 1, n); x2++) {int t = w[x1][k - x1];if (x2 != x1)t += w[x2][k - x2];for (int a = 0; a <= 1; a++)for (int b = 0; b <= 1; b++)f[k][x1][x2] = max(f[k][x1][x2], f[k - 1][x1 - a][x2 - b] + t);}}}cout << f[n + m][n][n] << endl;return 0;
}

传纸条在dp阶段的代码跟方格取数是一样的。
这是因为,当两条路径相交时,这个点加的值就是0+w[i][j]
如果选择让其中一条路径绕过这个点的话,加值就是w[i][j-1]+w[i][j]w[i-1][j]+w[i][j]
因为是非负数,所以绕路的情况一定优于有相交点的情况,有相交点的路径一定不是最优解。
不论是在方格取数中,还是在传纸条中,最优解永远不会由两段相交的路径组成。

参考

  • https://www.acwing.com/solution/content/12389/

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

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

相关文章

基于Matlab的眼底图像血管分割,Matlab实现

博主简介&#xff1a; 专注、专一于Matlab图像处理学习、交流&#xff0c;matlab图像代码代做/项目合作可以联系&#xff08;QQ:3249726188&#xff09; 个人主页&#xff1a;Matlab_ImagePro-CSDN博客 原则&#xff1a;代码均由本人编写完成&#xff0c;非中介&#xff0c;提供…

【webView中打开pdf文件,再点击设置切换页面后,再点击返回,则pdf无法正常显示,显示空白?】

https://developers.weixin.qq.com/community/develop/doc/000ea83ba5cb58a586feb827c59c00跟这个问题一样 解决办法就是在onshow中奖地址清了重新赋值&#xff0c;就是缓存的问题 <div><web-view :src"pdfurl" :webview-styles"webviewStyles" …

车道线检测论文:《Ultra Fast Structure-aware Deep Lane Detection》

该论文标题为《Ultra Fast Structure-aware Deep Lane Detection》&#xff0c;作者是浙江大学计算机科学与技术学院的Zequn Qin、Huanyu Wang和Xi Li。论文提出了一种新颖的、简单而有效的车道检测方法&#xff0c;旨在解决具有挑战性场景下的车道检测问题&#xff0c;并实现极…

借用QStyledItemDelegate 在DataView中创建各种子控件

在Model/View 中&#xff0c;二维表格的输入方式可能各种各样&#xff0c;我们需要在单元格嵌入各种类型控件&#xff0c;但是能把各种控件整合一个委托类吗&#xff1f;本文进行了尝试。将创建各种控件的逻辑整合到一个委托类。效果图如下&#xff1a; 本文实现了在DataView 的…

Android 带html标签文本添加自定义超链接跳转

Android 带html标签文本添加自定义超链接跳转 背景&#xff1a; 在项目开发过程中&#xff0c;需要在用户协议等文本中加入超链接跳转到APP内的其他界面&#xff0c;正常情况下我们都会知道用Html.fromHtml来识别html标签中的超链接&#xff0c;比如<a href"http://www…

【SpringMVC】知识汇总

SpringMVC 短暂回来&#xff0c;有时间就会更新博客 文章目录 SpringMVC前言一、第一章 SpingMVC概述二、SpringMVC常用注解1. Controller注解2. RequestMapping注解3. ResponseBody注解4. RequestParam5. EnableWebMvc注解介绍6. RequestBody注解介绍7. RequestBody与RequestP…

Echarts功能记录

基础配置 工具箱toolbox 对应功能 案例中使用到的第三方脚本

SpringBoot 启用 Https,生成 jks 自签证书

使用 Java 提供的工具生成 jks 自签证书 keytool 是 Java Development Kit (JDK) 中的一个工具&#xff0c;用于管理公钥和私钥对以及相关的证书。以下命令用于生成一个密钥对并将其存储在密钥库中&#xff1a; keytool -genkeypair -alias www.example.com -keyalg RSA -key…

解决Animate.css动画效果无法在浏览器运行问题

背景 在开发官方网站的时候&#xff0c;临时更换了电脑&#xff0c;发现原本正常的动画效果突然不动了。 经过 chrome、Microsoft Edge都无法运行。 Animate.css | A cross-browser library of CSS animations. 问题排查 通过审查元素后发现类名是注入并且生效的。 验证 然…

开源科学可视化软件

目录 0 参考链接 1 GR 2 VisIt 3 Inviwo 4 Voreen 5 MegaMol 6 ParaView 7 ROOT 8 Mayavi 9 PyQtGraph 10 vedo 11 Glumpy 12 SCIRun 13 Vispy 14 K3D 15 VTK 16 yt 17 Veusz 18 PyVista 18 TTK 20 Ipyvolume 21 Polyscope 22 GLVis 23 3D Slicer …

【图解物联网】第3章 物联网设备

3.1 设备——通向显示世界的接口 3.1.1 为什么要学习设备的相关知识 经过前两章的学习&#xff0c;想必各位读者已经掌握物联网这个词描绘出的世界和用于实现物联网的系统架构了。基于这点&#xff0c;这一章将会为大家介绍在物联网世界中起着核心作用的因素&#xff0c;即设…

atoi函数(想要彻底了解atoi函数,那么看这一篇就足够了!)

前言&#xff1a;在学习C语言的时候&#xff0c;我们知道每个字符都有其所对应的ASCII码值&#xff0c;当我们使用49来打印字符时&#xff0c;打印出来的就是数字字符 ‘ 1 ’&#xff0c;那么字符能否直接被转换成对应的整型数字呢&#xff1f;答案是当然可以&#xff0c;这时…

印度洋涡旋统计

印度洋涡旋统计 clear;clc;clf;close all; %% 读取涡旋半径、时间范围、经纬度信息,以及涡旋点的经纬度;半径路径和涡旋极性; file2=‘D:\matlab_work\accept_work\涡旋统计的平面分布\eddy_trajectory_2.0exp_19930101_20200307.nc’; time=double(ncread(file2,‘time’)…

一文搞懂数据链路层

数据链路层 1. 简介2. MAC3. 以太网 1. 简介 &#xff08;1&#xff09;概念 链路(link)是一条无源的点到点的物理线路段&#xff0c;中间没有任何其他的交换结点。 数据链路(data link) 除了物理线路&#xff08;双绞线电缆、同轴电缆、光线等介质&#xff09;外&#xff0…

2024-03-24 成长-周复盘-责任与能力-事情的推进与落地和完成

摘要: 过于一周发生太多事情&#xff0c;林林总总&#xff0c;有些事情为了避免重蹈覆辙&#xff0c;要进行回溯复盘。 主要集中于做事方式&#xff0c;做事方法&#xff0c;更多的是集中于失败的做事方式。 在认知层面&#xff0c;要通过做事的结果&#xff0c;来反向推导做…

详细安装步骤:vue.js 三种方式安装(vue-cli)

Vue.js&#xff08;读音 /vjuː/, 类似于 view&#xff09;是一个构建数据驱动的 web 界面的渐进式框架。Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。它不仅易于上手&#xff0c;还便于与第三方库或既有项目整合。 三种 Vue.js 的安装方法&…

二进制王国【蓝桥杯算法双周赛】

原题链接:https://www.lanqiao.cn/problems/17035/learning/?contest_id177 #include <bits/stdc.h> using namespace std;bool cmp(const string &x,const string &y) {return xy<yx; }int main() {int n; cin>>n;vector<string> vt(n);for(in…

Dockerfile优化

使用多阶段构建 go应用程序 # Build stage FROM golang:1.16 AS build WORKDIR /app COPY . . RUN go build -o myapp .# Runtime stage FROM alpine:latest WORKDIR /root/ COPY --frombuild /app/myapp . CMD ["./myapp"]Nodejs应用程序 # Build stage FROM nod…

matlab 将矩阵写入文件

目录 一、概述1、算法概述2、主要函数二、将矩阵写入到文本文件三、将矩阵写入电子表格文件四、将矩阵写入指定的工作表和范围五、将数据追加到电子表格六、将矩阵数据追加到文本文件七、参考链接本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此…

Debezium日常分享系列之:Debezium2.5稳定版本之处理常见问题

Debezium日常分享系列之&#xff1a;Debezium2.5稳定版本之处理常见问题 一、配置和启动错误二、MySQL 不可用三、Kafka Connect stops gracefully四、Kafka Connect 进程崩溃五、Kafka变得不可用六、MySQL 清除 binlog 文件七、Debezium技术总结 下面描述 Debezium 如何处理各…