IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> [Acwing] 算法提高课汇总一 动态规划- 数字三角形模型 -> 正文阅读

[数据结构与算法][Acwing] 算法提高课汇总一 动态规划- 数字三角形模型

数字三角形模型

1. 摘花生

就是最基础的数字三角形模型

状态表示 :
f [ i ] [ j ] f[i][j] f[i][j]表示当前 ( i , j ) (i,j) (i,j)的最大价值

状态转移 :
f [ i ] [ j ] = m a x ( f [ i ? 1 ] [ j ] , f [ i ] [ j ? 1 ] ) f[i][j] = max(f[i-1][j],f[i][j-1]) f[i][j]=max(f[i?1][j],f[i][j?1])

2.最低通行费

这个题还是最基础的数字三角形模型

只是变向的问了

对于一个 N × N N×N N×N的网格,限定 2 N ? 1 2N-1 2N?1步走出去

根据曼哈顿距离,我们可以知道如果只往下和右走,那么所需的距离正好就是 2 N ? 1 2N-1 2N?1

因此问题又回到了那个模板的问题

3.方格取数

题意 :
对于方格 ( i , j ) (i,j) (i,j)都赋予一个 w i , j w_{i,j} wi,j?

试问类似摘花生那种做法,做两次的最大值

拿完之后该点的权值为0

思路 :
如果分开走的话,那么第一次走完之后会有后效性影响第二次拿的价值,所以必须同时走

状态表示 :
f [ i 1 ] [ j 1 ] [ i 2 ] [ j 2 ] f[i_1][j_1][i_2][j_2] f[i1?][j1?][i2?][j2?]表示同时分别走到 从 ( 1 , 1 ) 开 始 走 到 ( i 1 , j 1 ) ( i 2 , j 2 ) 从(1,1)开始走到(i_1,j_1)(i_2,j_2) (1,1)(i1?,j1?)(i2?,j2?)的路径的集合

状态计算 :
f [ i 1 ] [ j 1 ] [ i 2 ] [ j 2 ] = m a x ( f[i_1][j_1][i_2][j_2]=max( f[i1?][j1?][i2?][j2?]=max(

f [ i 1 ? 1 ] [ j 1 ] [ i 2 ? 1 ] [ j 2 ] ? 从 上 面 转 移 f[i_1-1][j_1][i_2-1][j_2] -从上面转移 f[i1??1][j1?][i2??1][j2?]?
f [ i 1 ] [ j 1 ? 1 ] [ i 2 ? 1 ] [ j 2 ] ? 从 左 边 和 上 面 转 移 f[i_1][j_1-1][i_2-1][j_2] -从左边和上面转移 f[i1?][j1??1][i2??1][j2?]?
f [ i 1 ] [ j 1 ? 1 ] [ i 2 ] [ j 2 ? 1 ] ? 从 左 边 转 移 f[i_1][j_1-1][i_2][j_2-1] -从左边转移 f[i1?][j1??1][i2?][j2??1]?
f [ i 1 ? 1 ] [ j 1 ] [ i 2 ] [ j 1 ? 1 ] ? 从 上 面 和 左 边 转 移 ) f[i_1-1][j_1][i_2][j_1-1] - 从上面和左边转移) f[i1??1][j1?][i2?][j1??1]?)

当然因为拿完就置 0 0 0的存在,我们需要考虑 ( i 1 , j 1 ) ( i 2 , j 2 ) (i_1,j_1)(i_2,j_2) (i1?,j1?)(i2?,j2?)是否是相同的格子

因此我们可以做一个优化

我们令 k = i 1 + j 1 = i 2 + j 2 k=i_1+j_1=i_2+j_2 k=i1?+j1?=i2?+j2?

我们只需要 n ? 2 n*2 n?2的枚举 k k k以及枚举 i 1 i_1 i1?, i 2 i_2 i2?然后通过计算出来 j 1 j_1 j1? j 2 j_2 j2?即可

最后判断是否相同

const int N = 15;

int n;
int w[N][N], f[N*2][N][N];

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 <= 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 &x = f[k][i1][i2];
                    int t = w[i1][j1];
                    if(i1!=i2) t += w[i2][j2];
                    //不重合则需要加两个权重.
                    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[n*2][n][n] << endl;

4.传纸条

这里和前面的方格取数不一样的是

方格取数是从同一个起点开始,但是这里是从两个对角开始

并且走过的点不能再回走

思路 :
证明出来,最优的路径显然不是两个相交路径之和,同时又因为从右下角回传可用对称等效为从左上角传

所以完全可用套用方格取数模板

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-05-11 16:39:00  更:2022-05-11 16:41:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 3:23:37-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码