动态规划——线性dp

基于数字三角形问题扩展

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

方格取数

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

动态规划——线性dp

四维代码

#include

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

#include

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;
    }

    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原因就是在递推的过程中虽然枚举了重复的点,但这个重复的点一定不是最优解,会被最终的最优解覆盖掉,最终答案也一定是不含重复点的两条路线的最大和但是相同的代码可以同样a c 原因就是在递推的过程中虽然枚举了重复的点,但这个重复的点一定不是最优解,会被最终的最优解覆盖掉,最终答案也一定是不含重复点的两条路线的最大和

Original: https://blog.csdn.net/qq_63092029/article/details/128413614
Author: 向夕阳Salute
Title: 动态规划——线性dp

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/788352/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • drf 频率类

    频率类源码 入口: 入口: 1)APIView的dispath方法的 self.initial(request,*args,**keargs)点进去 2) self。check_t…

    Python 2023年6月12日
    056
  • python随机数(random)

    import random import string random.randint(a,b) 在python中的random.randint(a,b)用于生成一个指定范围内的整数…

    Python 2023年8月1日
    040
  • haproxy2.6负载安装配置

    1、下载解压 https://www.haproxy.org/download/2.6/src/haproxy-2.6.1.tar.gztar -xvf haproxy-2.6.1…

    Python 2023年11月7日
    031
  • JavaScript入门④-万物皆对象:Object

    JavaScript入门系列目录 JavaScript入门①-基础知识筑基 JavaScript入门②-函数(1)基础{浅出} JavaScript入门③-函数(2)原理{深入}执…

    Python 2023年10月13日
    054
  • 开发者神器,代码文档终于有救了

    程序员宝藏库:你想要的,应有尽有! DevWeekly收集整理每周优质开发者内容,包括 开源项目、 资源工具、 技术文章等方面。 每周五定期发布,同步更新到知乎:Jackpop 和…

    Python 2023年11月8日
    042
  • Pandas入门笔记

    文章目录 pandas * pandas 排序 pandas选择指定数据 pandas改变指定位置的值 pandas 处理文件 pandas 合并数据 pandas Merge p…

    Python 2023年8月8日
    061
  • Flask 框架学习1

    常用快捷键: 自动导包:option+enter(mac)ctl+enter(windows) 查看传参:ctr+ p 新增文件:ctr + n 替换:Ctrl + r 空格不规范…

    Python 2023年8月10日
    045
  • 数据处理:Numpy & Pandas(1)

    本文来自B站up莫烦python的视频教学,在此感谢https://www.bilibili.com/video/BV1Ex411L7oT 1 Numpy 导入numpy impo…

    Python 2023年8月28日
    037
  • python画图matplotlib直方图条怎么变宽_matplotlib直方图库宽度的变化

    我在matplotlib中创建一个柱状图,但有问题,因为这些条的宽度是不同的,而它们都应该是相同的宽度。这方面的一个例子是: 在图像中,左列有完整的直方图,而右列在完整直方图的部分…

    Python 2023年9月4日
    050
  • python开发工具pycharm使用简介

    pycharm是一款常用的python开发工具,功能十分强大,并且多平台支持(Windows/MacOS/Linux),官方提供社区开源版本:pycharm Community免费…

    Python 2023年8月13日
    070
  • 实战模拟│揭秘为啥年会你抽不到特等奖

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Python 2023年6月12日
    066
  • 不止短信!教你用 Python 发送告警通知到微信

    Original: https://www.cnblogs.com/sn520/p/15770798.htmlAuthor: Python可乐呀Title: 不止短信!教你用 Py…

    Python 2023年5月24日
    038
  • 十分钟学会如何用Python处理CSV文件

    在前几年,如果你和嵌入式开发人员推荐Python,大概会是这样一种场景: A:”诶,老王,你看Python开发这么方便,以后会不会用到嵌入式设备?” B:&…

    Python 2023年8月1日
    058
  • Linux Block模块之deadline调度算法代码解析

    🚀 优质资源分享 🚀 学习路线指引(点击解锁)知识定位人群定位 进阶级本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。 入…

    Python 2023年8月14日
    058
  • scrapy爬虫总结

    目录 一. Scrapy * 1. 概述 2. 流程 3. 创建爬虫命令 二. Selenium * 1. 概述 2. Python + Selenium WebDriver &#…

    Python 2023年10月2日
    066
  • Cesium 加载影像数据

    【主要参考博客链接】【常见地图服务WMS、WFS、WCS、TMS、WMTS】 一、Django环境准备 django-admin startprroject name python…

    Python 2023年8月5日
    050
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球