动态规划——线性dp

news2024/11/19 5:54:14

基于数字三角形问题扩展


参考闫氏 d p 分析法 参考闫氏dp分析法 参考闫氏dp分析法

方格取数

f [ i 1 ] [ j 1 ] [ i 2 ] [ j 2 ] 表示( 1 , 1 )到( i 1 , j 1 )和( 1 , 1 )到 ( i 2 , j 2 ) 和的最大值 f[i1][j1][i2][j2]表示(1,1)到(i1,j1)和(1,1)到(i2,j2)和的最大值 f[i1][j1][i2][j2]表示(1,1)到(i1,j1)和(1,1)到(i2,j2)和的最大值
利用最后一步不同的思想,找个集合可以由四种状态转移过来 利用最后一步不同的思想,找个集合可以由四种状态转移过来 利用最后一步不同的思想,找个集合可以由四种状态转移过来
分别是 ( i 1 , j 1 ) 由 ( i 1 − 1 , j 1 ) 向下得来或者 ( i 1 , j 1 − 1 ) 向右得来的两种情况和 ( i 2 , j 1 ) 分别由 ( i 2 − 1 , j 2 ) , ( i 2 , j 2 − 1 ) 两种情况组合而成 分别是(i1,j1)由(i1-1,j1)向下得来或者(i1,j1-1)向右得来的两种情况和(i2,j1)分别由(i2-1,j2),(i2,j2-1)两种情况组合而成 分别是(i1,j1)(i11,j1)向下得来或者(i1,j11)向右得来的两种情况和(i2,j1)分别由(i21,j2),(i2,j21)两种情况组合而成
这个题还有个限制就是每个方格只能取一次,所有 ( i 1 , j 1 ) , ( i 2 , j 2 ) 到了相同的点只需要加一次权值 这个题还有个限制就是每个方格只能取一次,所有(i1,j1),(i2,j2)到了相同的点只需要加一次权值 这个题还有个限制就是每个方格只能取一次,所有(i1,j1),(i2,j2)到了相同的点只需要加一次权值

图解

四维代码


#include<bits/stdc++.h>

using namespace std;

const int N = 12;

int n, x, y, c;

int f[N][N][N][N];

int w[N][N];

int main(){
    
    cin >> n;
    
    while((cin >> x >> y >> c), (x && y && c)){
        w[x][y] = c;
    }
    
    for(int i1 = 1; i1 <= n; i1 ++)
    {
        for(int j1 = 1; j1 <= n; j1 ++)
        {
            for(int i2 = 1; i2 <= n; i2 ++)
            {
                for(int j2 = 1; j2 <= n; j2 ++)
                {
                    int &v = f[i1][j1][i2][j2];
                    v = f[i1-1][j1][i2-1][j2] + w[i1][j1];
                    v = max(f[i1][j1-1][i2-1][j2] + w[i1][j1], v);
                    v = max(f[i1-1][j1][i2][j2-1] + w[i1][j1], v);
                    v = max(f[i1][j1-1][i2][j2-1] + w[i1][j1], v);
                    if(i1 != i2 && j1 != j2)
                    {
                        v += w[i2][j2];
                    }
                }
            }
        }
    }
    cout << f[n][n][n][n];
    return 0;
    
}


四维的 f [ i 1 ] [ j 1 ] [ i 2 ] [ j 2 ] 是 ( 1 , 1 ) ( 1 , 1 ) 到 ( i 1 , j 1 ) ( i 2 , j 2 ) 路线的集合 四维的f[i1][j1][i2][j2]是(1,1)(1,1)到(i1,j1)(i2,j2)路线的集合 四维的f[i1][j1][i2][j2](1,1)(1,1)(i1,j1)(i2,j2)路线的集合
我们发现重合点一定是偏移量相同时 ( i 1 + j 1 = = i 2 + j 2 ) 才可能重合 我们发现重合点一定是偏移量相同时(i1+j1==i2+j2)才可能重合 我们发现重合点一定是偏移量相同时(i1+j1==i2+j2)才可能重合
上面那个思路 i 1 + j 1 和 i 2 + j 2 是没关系的,但我们可以加一个 k 当作偏移量 上面那个思路i1+j1和i2+j2是没关系的,但我们可以加一个k当作偏移量 上面那个思路i1+j1i2+j2是没关系的,但我们可以加一个k当作偏移量
k = i 1 + j 1 = i 2 + j 2 k=i1+j1=i2+j2 k=i1+j1=i2+j2
这样 f [ k ] [ i 1 ] [ i 2 ] 就相当于偏移量相同的 ( 1 , 1 ) ( 1 , 1 ) 到 ( i 1 , k − i 1 ) ( i 2 , k − i 2 ) 这样f[k][i1][i2]就相当于偏移量相同的(1,1)(1,1)到(i1,k-i1)(i2,k-i2) 这样f[k][i1][i2]就相当于偏移量相同的(1,1)(1,1)(i1,ki1)(i2,ki2)
这样我们就实现了代码的优化 这样我们就实现了代码的优化 这样我们就实现了代码的优化
三维代码

#include<bits/stdc++.h>

using namespace std;

const int N = 25;

int n, x, y, c;

int f[N][N][N];

int w[N][N];

int main(){
    
    cin >> n;
    
    while((cin >> x >> y >> c), (x && y && c)){
        w[x][y] = c;
    }
    
    //k是x+y的偏移量(i1,j1),(i2,j2)都是k偏移量时的最大和
    for(int k = 2; k <= n << 1; k ++)
    {
        for(int i1 = 1; i1 <= n; i1 ++)
        {
            for(int i2 = 1; i2 <= n; i2 ++)
            {
                int j1 = k - i1;
                int j2 = k - i2;
                if(j1 >=1 && j1 <= n && j2 >=1 && j2 <= n)
                {
                    int &v = f[k][i1][i2];
                    int tem = w[i1][j1];
                    v = max(v, f[k-1][i1-1][i2-1] + tem);
                    v = max(v, f[k-1][i1][i2] + tem);
                    v = max(v, f[k-1][i1][i2-1] + tem);
                    v = max(v, f[k-1][i1-1][i2] + tem);
                    
                    if(i1 != i2) v += w[i2][j2];
                }
            }
        }
    }
    
    cout << f[2*n][n][n] << endl;
    return 0;
    
}


扩展 扩展 扩展
传字条的题目与这个题目的区别就是重复的点不可以过,而这个题是重复的点可以过但取为 0 传字条的题目与这个题目的区别就是重复的点不可以过,而这个题是重复的点可以过但取为0 传字条的题目与这个题目的区别就是重复的点不可以过,而这个题是重复的点可以过但取为0
但是相同的代码可以同样 a c 原因就是在递推的过程中虽然枚举了重复的点,但这个重复的点一定不是最优解,会被最终的最优解覆盖掉,最终答案也一定是不含重复点的两条路线的最大和 但是相同的代码可以同样ac原因就是在递推的过程中虽然枚举了重复的点,但这个重复的点一定不是最优解,会被最终的最优解覆盖掉,最终答案也一定是不含重复点的两条路线的最大和 但是相同的代码可以同样ac原因就是在递推的过程中虽然枚举了重复的点,但这个重复的点一定不是最优解,会被最终的最优解覆盖掉,最终答案也一定是不含重复点的两条路线的最大和

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

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

相关文章

ubuntu小技巧29--frp实现通过公网访问内网服务

ubuntu小技巧29--frp实现通过公网访问内网服务1 介绍2 方法步骤3 注意事项4 说明1 介绍 很多时候我们需要在外部网络中访问局域网或者个人家庭主机&#xff0c;以便于实现一个机器在多个地方都能用&#xff0c;此时我们就可以使用 frp 或者其竞品来实现该功能。 frp 是一个专…

11Python面相对象基础语法

面相对象基础语法 01. dir 内置函数 在 Python 中 对象几乎是无所不在的&#xff0c;我们之前学习的 变量、数据、函数 都是对象 在 Python 中可以使用以下两个方法验证&#xff1a; 使用内置函数 dir 传入 标识符 / 数据&#xff0c;可以查看对象内的 所有属性及方法 提示…

基于 UWB 数字孪生钢厂人员安全定位

钢铁冶炼从原料采购、焦化烧结、炼铁、炼钢、轧钢、到产出成品&#xff0c;其冗长的生产工序、复杂的作业场景&#xff0c;更应加以重视生产现场的人员作业安全&#xff0c;将安全防范监管贯穿日常作业全过程&#xff0c;打通安全生产责任“最后一公里”。 随着近几年钢厂信息…

电源管理芯片|“小方寸”大作为—TMI3191直击智能穿戴电源痛点!

随着移动通信、人工智能等技术的不断发展和融合, 智能终端产业正在加速裂变&#xff0c;智能穿戴迅速成为人们日常生活和工作中的新宠。 根据IDC最新数据显示&#xff0c;2016年~2020年出货量从1.02亿台增长至4.45亿台&#xff0c;预测2020-2025年全球智能可穿戴设备出货量复合…

手写B+树

1.特点 https://blog.csdn.net/weixin_57128596/article/details/127030901?ops_request_misc%257B%2522request%255Fid%2522%253A%2522167176442416800188598723%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id167176442416800…

springboot mybatis大学生校园宿舍管理系统源码含文档

摘 要&#xff1a;宿舍是大学生学习与生活的主要场所之一&#xff0c;宿舍管理是高校学工管理事务中 尤为重要的一项。随着我国高校招生规模的进一步扩大&#xff0c;学生总体人数的不断增加&#xff0c; 宿舍管理工作变得愈加沉重和琐碎&#xff0c;学生宿舍信息的采集、汇总…

Classifier Guided Diffusion

前言 上次已经学习了open AI的 DDPM(DDPM原理与代码剖析)和 IDDPM(IDDPM原理和代码剖析), 以及 斯坦福的 DDIM DDIM原理及代码(Denoising diffusion implicit models). 这次来看openAI的另一个作品 Diffusion Models Beat GANs on Image Synthesis github: https://github.com…

操作系统(4)页面替换策略算法模拟实现

1. 效果展示 2. 程序流程图 &#xff08;1&#xff09; 程序总流程 &#xff08;2&#xff09; FIFO策略 &#xff08;3&#xff09; LRU策略 &#xff08;4&#xff09; OPT策略 3. 数据结构设计 //页面数据结构struct PageInfo {int id;int visit;};PageInfo* Block; // 物…

我国电力物流行业发展现存问题及解决策略分析 企业应加强信息化建设

电力物流是电力发、输、配、售流程的一部分&#xff0c;是为了满足终端用户需求&#xff0c;对电力从发电到终端用户的高效率、高效益的流动以及流程各环节相互提供的服务和相关信息在此过程中的正、反向流动所进行的计划、实施与控制过程。 根据观研报告网发布的《中国电力物流…

nginx反向代理ssl配置

nginx反向代理是各大应用环境最重要的环节&#xff0c;今天我们来说说如何配置反代理SSL这书&#xff0c;首先配置准备好&#xff1a;nginx环境、SSL证书、确定需要设置的端口防火墙开放&#xff08;尤其是云服务器需要单独设置&#xff0c;windows防火墙单独设置&#xff09;。…

电巢:上海半导体投资浪潮的前奏、高潮与转折

朱旭东是上海半导体投资界的开创性人物&#xff0c;他带领浦科投资投出了中微半导体、盛美半导体等当下的「国之重器」&#xff0c;并控股了万业企业、上工申贝等A股上市公司。随后又在国内率先发起设立并管理了上海半导体装备材料产业投资基金&#xff0c;推动旗下上市公司万业…

前端开发--JavaScript Bom和Dom

JavaScript Bom和Dom这一篇就够啦JavaScript Bom和Dom1、Web API 基本认知2、DOM -- 基础2.1 DOM简介2.2 获取元素2.3 事件基础2.4 操作元素2.5 节点操作2.6 DOM重点核心3、DOM -- 事件高级3.1 注册事件(绑定事件)3.2 删除事件(解绑事件)3.3 DOM事件流3.4 事件对象3.5 事件委托…

如何理解UML2.5.1(05篇)

标记subsets和redefines可以说是UML2.5.1中最重要的一对标记。标记subsets相对要好理解一些&#xff0c;但是redefines的含义就没有那么直白。先看一下目前已知的subsets和redefines的效果&#xff1a; 假定图一中A1和B1的关联两端的标记都是subsets&#xff0…

Torch计算方法

Torch 中的计算方法与 Numpy 的计算方法很类似&#xff1b;Torch中带 “下划线 ” 的操作&#xff0c;都是in-place的。 求和&#xff1a; torch.sum() 对输入的 tensor 数据的某一维度求和&#xff1b; &#xff11;&#xff0e;torch.sum(input, dtypeNone) &#xff12;&…

硬盘 / 硬盘控制器主要端口寄存器 / Controller Register

文章目录IDE 与 SATA硬盘分区表结构硬盘控制器主要端口寄存器data 寄存器Error && FeaturesErrorFeaturesSector countLBA low | mid | highdevice 寄存器StatusCommandIDE 与 SATA 很久以前&#xff0c;硬盘控制器和硬盘是分开的&#xff0c;后面开发了一个新接口&am…

【观察】新华三:智慧计算“再进化”,算力创新“再升级”

今天&#xff0c;算力就是生产力已成为业界共识&#xff0c;特别是算力作为数字经济时代的关键生产力要素&#xff0c;更成为了挖掘数据要素价值&#xff0c;推动数字经济发展的核心支撑力和驱动力。在此过程中&#xff0c;由算力驱动的数字经济除了以信息产业这一独立的经济形…

Linux进程间通信(二):命名管道的使用和原理

文章目录一、前言二、命名管道的使用一、前言 我们上篇博客里谈到&#xff0c;进程间通信的本质在于如何让两个进程看到同一份资源。匿名管道的核心思想就是让子进程继承父进程&#xff0c;从而让父子进程看到同一份管道文件&#xff0c;但这也使通信仅仅局限在具有血缘关系的进…

比Sqoop功能更加强大开源数据同步工具DataX实战

文章目录概述定义与Sqoop对比框架设计支持插件核心架构核心优势部署基础环境安装从stream读取数据并打印到控制台读取MySQL写入HDFS读取HDFS写入MySQL执行流程概述 定义 DataX 官网地址 https://maxwells-daemon.io/ DataX GitHub源码地址 https://github.com/alibaba/DataX D…

SaaS是什么?企业采购SaaS有什么好处?

简单的来讲讲我们对SaaS的理解吧。过去通常来说&#xff0c;我们采购企业使用的产品&#xff0c;通常有比如传统的软件包下载、按照自己的需求找开发商定制、如果有自研能力的团队可以自己去开发。但是这样就比如带来很多问题&#xff1a; 比如业务规则更新了怎么办&#xff1…

Protobuf 了解

Protocol Buffers 是一种结构数据序列化方法&#xff0c;可以将C中定义的存储类的内容与二进制序列串相互转换&#xff0c;主要用于数据传输或数据存储&#xff0c;可类比XML、JSON&#xff0c;而XML、JSON基于文本格式&#xff0c;protobuf是二进制格式&#xff0c;所以比XML、…