动态规划专项---数字三角形模型

news2025/1/11 7:50:19


文章目录 

  • 摘花生
  • 最低通行费
  • 方格取数
  • 传纸条

一、摘花生OJ链接

        本题思路:本题是dp问题中比较简单的模型,dp问题考虑方式:状态表示:集合:定义f[i][j]为从(1, 1)到达(i, j)的所有方案,属性:最大值。状态转移:(i, j)从(i-1, j)即上方过来,(i, j)从(i, j-1)即左方过来。当然这一题也可以进行空间压缩的方式求解。f[i][j]只需要用到这一层和上一层的f元素,所以可以压缩成滚动数组。在此之上,还可以直接压缩成一维数组。

#include <bits/stdc++.h>

constexpr int N=110;

int r,c;
int g[N][N];
int f[N][N];//表示所有从(1,1)走到(i,j)的路线的集合,该集合的属性为最大值

int main()
{
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);std::cout.tie(nullptr);
    
    int T;
    std::cin>>T;
    while(T--){
        std::cin>>r>>c;
        for(int i=1;i<=r;i++)
            for(int j=1;j<=c;j++)
                std::cin>>g[i][j];
        
        for(int i=1;i<=r;i++)
            for(int j=1;j<=c;j++)//状态计算分为两种第一种是最后一步是从上面来的,第二种是从左边过来的。
                f[i][j]=std::max(f[i-1][j],f[i][j-1])+g[i][j];
        std::cout<<f[r][c]<<std::endl;
    }
    return 0;
}

二、最低通行费OJ链接

        本题思路:本题与上题一样的思路,要在2*N-1的时间内走完说明不能往回走。然后只需要注意边界条件即可。

#include <bits/stdc++.h>

constexpr int N=110;

int n;
int g[N][N];
int f[N][N];

int main()
{
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);std::cout.tie(nullptr);
    
    std::cin>>n;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            std::cin>>g[i][j];
    
    memset(f,0x3f,sizeof f);
    f[1][1]=g[1][1];
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++){
            f[i][j]=std::min(f[i][j],f[i-1][j]+g[i][j]);
            f[i][j]=std::min(f[i][j],f[i][j-1]+g[i][j]);
        }
    std::cout<<f[n][n]<<std::endl;
    return 0;
}

三、方格取数OJ链接

        本题思路:本题中是走两次,那么状态表示:f[i1,j1,i2,j2]表示所有从(1,1),(1,1)分别走到(i1,j1),(i2,j2)的路径的最大值。由于走两次可以看成是两条路径同时走,因此k表示两条路线当前走到的各自的横纵坐标之和k == i1 + j1 == i2 + j2,注意:只有在i1 + j1 == i2 + j2时,两条路径走到的当前格子才可能重合。这里可以优化将四维状态优化成三维。

#include <bits/stdc++.h>

constexpr int N=15;

int n;
int g[N][N];
int f[N*2][N][N];//思维状态优化成三维,利用横枞坐标的和来解决

int main()
{
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);std::cout.tie(nullptr);
    
    std::cin>>n;
    int a,b,c;
    while(std::cin>>a>>b>>c,a||b||c) g[a][b]=c;
    
    for(int k=2;k<=2*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&&j1<=n&&j2>=1&&j2<=n){//边界条件
                    int t=g[i1][j1];
                    if(i1!=i2) t+=g[i2][j2];//说明此时两个点没有重合
                     int& x=f[k][i1][i2];
                     x=std::max(x,f[k-1][i1-1][i2-1]+t);//下 下
                     x=std::max(x,f[k-1][i1-1][i2]+t);//下 右
                     x=std::max(x,f[k-1][i1][i2-1]+t);//右 下
                     x=std::max(x,f[k-1][i1][i2]+t);//右 右
                }
            }
    std::cout<<f[n*2][n][n]<<std::endl;
    return 0;
}

四、传纸条OJ链接

        本题思路:本题与上面的方格取数是一样的题目。

#include <bits/stdc++.h>

constexpr int N=55;

int m,n;
int g[N][N];
int f[N*2][N][N];//思维状态优化成三维,利用横枞坐标的和来解决

int main()
{
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);std::cout.tie(nullptr);
    
    std::cin>>n>>m;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            std::cin>>g[i][j];
            
    for(int k=2;k<=m+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&&j1<=m&&j2>=1&&j2<=m){//边界条件
                    int t=g[i1][j1];
                    if(i1!=i2) t+=g[i2][j2];//说明此时两个点没有重合
                     int& x=f[k][i1][i2];
                     x=std::max(x,f[k-1][i1-1][i2-1]+t);//下 下
                     x=std::max(x,f[k-1][i1-1][i2]+t);//下 右
                     x=std::max(x,f[k-1][i1][i2-1]+t);//右 下
                     x=std::max(x,f[k-1][i1][i2]+t);//右 右
                }
            }
    std::cout<<f[n+m][n][n]<<std::endl;
    return 0;
}

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

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

相关文章

经纬恒润为国产化芯片的AoU功能安全软件赋能

近日&#xff0c;经纬恒润成功为旗芯微FC4150开发出符合功能安全要求的AoU功能安全组件&#xff0c;并适配到门模块配套产品&#xff0c;为国产化芯片完善了符合功能安全的生态链。 AoU&#xff08;Assumption of Use,安全假设&#xff09;需求是芯片厂商在safety manual对最终…

场效应管(MOSFET)笔记-nmos和pmos仿真测试

一、场效应管的介绍 场效应管是一种半导体器件&#xff0c;它可以用来放大或者控制电流。根据结构的不同&#xff0c;场效应管可以分为结型场效应管&#xff08;JFET&#xff09;和绝缘栅场效应管&#xff08;MOSFET&#xff09;。其中&#xff0c;JFET是由一个pn结构组成&…

口袋参谋:一键查询任意买家旺旺号,规避被降权风险!

​ 对于淘宝天猫的卖家来说&#xff0c;查买家旺旺号是维护淘宝卖家销售权益的一种途径。 卖家通过查买家的旺旺号&#xff0c;从而得知买家的账号信息、买家信誉以及中差评等内容&#xff0c;减少淘宝卖家受骗上当的机率。 【查降权号】功能&#xff1a; 针对淘宝订单可一键查…

设计模式篇---装饰模式

文章目录 概念结构实例总结 概念 装饰模式&#xff1a;动态的给一个对象增加一些额外的职责。就扩展功能而言&#xff0c;装饰模式提供了 一种比使用子类更加灵活的替代方案。 装饰模式是一种对象结构型模式&#xff0c;它以对客户透明的方式动态地给一个对象附加上更多的责任…

MinIO实现数据迁移(mc)

运行两个版本的minio version: 2.3 services: # 新版本 minio2023: image: minio/minio:RELEASE.2022-06-20T23-13-45Z.fips container_name: minio2023 restart: always environment: - MINIO_ACCESS_KEYminioadmin - MINIO_SECRET_KEYminioadmin - MINIO_ROOT_USERminioadm…

C/C++轻量级并发TCP服务器框架Zinx-框架开发003:转大写字母输出+责任链模式+代码重构思路及实现

文章目录 1 添加转大写字母输出功能2 责任链模式2.1 责任链的设计2.2 责任链的实现2.3 责任链的测试 3 代码重构3.1 类图设计3.2 重构设计 - 头文件3.3 重构实现 1 添加转大写字母输出功能 功能流程&#xff1a; stdin通道类中包含一个功能处理类对象功能处理类中包含一个stdo…

【嵌入式】如何改造STLINK,使其在下载程序时无需外接3.3V电源

文章目录 1. 问题2. 原因及解决方法3. 开始改造4. 参考资料 1. 问题 在使用这种大号的 STLINK 给开发板下载程序时&#xff0c;都需要对开发板进行供电&#xff0c;有些麻烦&#xff0c;但是使用 J-Link 的时候就不需要外接电源&#xff0c;那有没有什么办法可以将 STLINK 改造…

谁家分析数据还要开发啊,不都一键得报表吗?

点击导入数据&#xff0c;再回来BI系统已经把近百张数据分析报表放在眼前了&#xff0c;每月都要计算分析的指标有了&#xff0c;领导要的数据分析有了&#xff0c;自己要的业绩分析也有了&#xff0c;甚至自己没想到的一些分析主题&#xff0c;它也贴心地做好了。有这样一套BI…

13.Oracle通过JDBC连接Java

Oracle通过JDBC连接Java 一、什么是JDBC二、Oracle通过JDBC连接Java1、导入jar包1.1 下载jar包1.2 将jar包导入到java项目中1.3编译jar包 2、连接数据库2.1 编写jdbc工具类2.2 对数据进行基本操作 一、什么是JDBC JDBC&#xff08;Java Database Connectivity&#xff09;是Jav…

mysql查询json字符串内容

参考文章&#xff1a;mysql json 基础查询_mysql json查询-CSDN博客 mysql查询json字符串内容 &#xff08;多层数组嵌套&#xff09; select id,nameJSON_EXTRACT(JSON_UNQUOTE(JSON_EXTRACT(JSON_UNQUOTE(config_json), $.baseInfo)), $.template_list[*].sms_content) s…

在微信上怎么做抽奖活动

微信抽奖活动&#xff1a;让你轻松吸引粉丝&#xff0c;打造火爆互动场景&#xff01; 随着微信的普及&#xff0c;越来越多的人开始利用微信平台进行营销和推广。而微信抽奖活动作为一种有效的营销手段&#xff0c;能够迅速吸引用户的关注和参与&#xff0c;提高品牌曝光度和…

文件包含_具体场景、zip、php相关问题

具体场景—上传可控的文件 具体场景—远程文件包含 具体场景—伪协议

使用键盘管理器更改键盘快捷键,让键盘真正迎合你的使用习惯

如果默认快捷键不适合你&#xff0c;你肯定会想知道如何在Windows 11中更改键盘快捷键。 也许你已经习惯了macOS键盘&#xff0c;或者像我一样在Windows和Mac之间切换工作/游戏——如果是这样的话&#xff0c;重新配置默认的Windows快捷方式&#xff0c;使其与Mac上的快捷方式…

畜牧业可视化畜牧业数字孪生

"畜牧业是我国重要的农业产业之一&#xff0c;对于国民经济的发展和人民群众的生活具有重要的意义。智慧畜牧作为现代畜牧业的发展方向之一&#xff0c;将信息技术和现代管理相结合&#xff0c;提高养殖效率和品质&#xff0c;为行业的可持续发展注入新的动力。智慧畜牧是…

产品经理的能力模型是什么?

一个产品的成功需要团队成员利用自己的技能共同合作完成。作为团队的核心和产品的主导者&#xff0c;产品经理需要具备一定的能力模型&#xff0c;以更好地完成工作。下面从五个方面进行解答。 首先&#xff0c;产品经理需要具备需求分析的能力。需求是用户在特定场景下产生的欲…

go语言学习之旅之Go语言数据类型

学无止境&#xff0c;今天学习Go 语言数据类型 Go&#xff08;或Golang&#xff09;是一种静态类型语言&#xff0c;这意味着变量的数据类型必须显式声明&#xff0c;并且在运行时不能更改。以下是Go中的一些基本数据类型&#xff1a; 这里仅介绍最常用的类型 数值类型: int: …

计算机领域十大天神

✍️作者简介&#xff1a;沫小北/码农小北&#xff08;专注于Android、Web、TCP/IP等技术方向&#xff09; &#x1f433;博客主页&#xff1a;沫小北/码农小北 开源中国、稀土掘金、51cto博客、博客园、知乎、简书、慕课网、CSDN &#x1f514;如果文章对您有一定的帮助请&…

Redis篇---第四篇

系列文章目录 文章目录 系列文章目录前言一、说一下 Redis 有什么优点和缺点二、Redis 缓存刷新策略有哪些?三、Redis 持久化方式有哪些?以及有什么区别?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章…

OpenLayer系列——【一】初识OpenLayer与OpenLayer视图操作

初识OpenLayer 1、初始化地图渲染 安装openlayer依赖 npm i ol首先准备一个容器用来渲染地图 <div id"map" ref"map" style"width: 100%; height: 100%" />导入依赖初始化地图 import ol/ol.css; import OSM from ol/source/OSM.js; …