首页 > 其他分享 >【洛谷 P1216】[USACO1.5] [IOI1994]数字三角形 Number Triangles 题解(动态规划)

【洛谷 P1216】[USACO1.5] [IOI1994]数字三角形 Number Triangles 题解(动态规划)

时间:2024-09-16 12:51:36浏览次数:12  
标签:洛谷 数字 USACO1.5 int 题解 路径 样例 IOI1994 dp

[USACO1.5] [IOI1994]数字三角形 Number Triangles

题目描述

观察下面的数字金字塔。

写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的和最大。每一步可以走到左下方的点也可以到达右下方的点。

【洛谷 P1216】[USACO1.5] [IOI1994]数字三角形 Number Triangles 题解(动态规划)_ci

在上面的样例中,从 【洛谷 P1216】[USACO1.5] [IOI1994]数字三角形 Number Triangles 题解(动态规划)_i++_02 的路径产生了最大权值。

输入格式

第一个行一个正整数 【洛谷 P1216】[USACO1.5] [IOI1994]数字三角形 Number Triangles 题解(动态规划)_i++_03 ,表示行的数目。

后面每行为这个数字金字塔特定行包含的整数。

输出格式

单独的一行,包含那个可能得到的最大的和。

样例 #1

样例输入 #1

5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5

样例输出 #1

30

提示

【数据范围】
对于 【洛谷 P1216】[USACO1.5] [IOI1994]数字三角形 Number Triangles 题解(动态规划)_ci_04 的数据,【洛谷 P1216】[USACO1.5] [IOI1994]数字三角形 Number Triangles 题解(动态规划)_i++_05,所有输入在 【洛谷 P1216】[USACO1.5] [IOI1994]数字三角形 Number Triangles 题解(动态规划)_i++_06 范围内。

题目翻译来自NOCOW。

USACO Training Section 1.5

IOI1994 Day1T1


思路

,使用一个二维数组 a 存储数字三角形的值,使用一个二维数组 dp 存储从顶点到每个位置的最大路径和。

状态转移方程:

dp[i][j] = max(dp[i - 1][j - 1], dp[i - 1][j]) + a[i][j];

在初始化 dp 数组时,dp[0][0] 赋值为 0。

在每次状态转移时,判断上一行的相邻两个位置的最大值,加上当前位置的值,得到当前位置的最大路径和。

最后,遍历最后一行的所有位置,取最大值即可。


AC代码

#include <iostream>
#include <algorithm>
#define AUTHOR "HEX9CF"
using namespace std;

const int N = 1e3 + 5;

int r;
int ans;
int a[N][N];
int dp[N][N];

int main()
{
    cin >> r;
    for (int i = 1; i <= r; i++)
    {
        for (int j = 1; j <= i; j++)
        {
            cin >> a[i][j];
        }
    }
    dp[0][0] = 0;
    for (int i = 1; i <= r; i++)
    {
        for (int j = 1; j <= i; j++)
        {
            dp[i][j] = max(dp[i - 1][j - 1], dp[i - 1][j]) + a[i][j];
        }
    }
    ans = 0;
    for (int j = 1; j <= r; j++)
    {
        // cout << dp[r][j] << endl;
        ans = max(ans, dp[r][j]);
    }
    cout << ans << endl;
    return 0;
}

标签:洛谷,数字,USACO1.5,int,题解,路径,样例,IOI1994,dp
From: https://blog.51cto.com/HEX9CF/12031069

相关文章

  • 题解:P9938 [USACO21OPEN] Acowdemia II B
    首先根据每篇出版物构建一个资历比较矩阵\(g\),其中\(g_{a,b}=1\)表示研究员\(a\)比\(b\)资历更高。遍历每篇出版物,识别出第一个降序的名字,然后假定该名字之后的所有研究员资历都比当前名字对应的研究员资历高即可。代码:#include<bits/stdc++.h>usingnamespacestd;......
  • 题解:P9951 [USACO20FEB] Swapity Swap B
    奶牛的排列经过\(x\)次后会回到原来的位置,理解以下:\([a_1,a_2]\)的牛翻转两次就会回到原来的位置,\([b_1,b_2]\)的牛翻转两次也会回到原来的位置,所以原来奶牛的排列经过一定次数的旋转后一定会回到原来位置。我们只要先模拟得出多少次后第\(i\)位的奶牛会回到原来的位置,然后......
  • 题解:P9953 [USACO20OPEN] Social Distancing II B
    解决思路:根据奶牛的位置对数组进行排序。计算相邻健康奶牛和感染奶牛之间的最小距离。这个距离值减一用来估计感染传播的半径。(确保了感染奶牛之间的距离在当前半径下不会导致传播给其他健康奶牛。)遍历排序后的奶牛列表,找到每一段连续感染奶牛的区域,并计算这些区域中可能需要的......
  • 区间检测题解
    记录\(pre_i\)为\(a_i\)上一次出现的位置。每一次求\([L,R]\)范围内是否有相同的数即\(pre_L\)到\(pre_R\)中的最大值是否小于\(L\)。注意到\(pre_1\)到\(pre_{L-1}\)中最大数一定小于\(L\),所以求\([L,R]\)范围内是否有相同的数即\(pre_1\)到\(pre_R\)中的......
  • 题解:P9957 [USACO20DEC] Stuck in a Rut B
    由于\(x,y\leq10^9\),我们无法模拟每个时间段。因此,我们需要尝试判断两头牛何时会相交。一个重要的观察是,牛不能后退,所以两头牛发生碰撞的唯一方式是\(n[x]>e[x]\)且\(n[y]<e[y]\)。可以按牛的起始坐标进行排序,然后模拟这些碰撞。代码:#include<bits/stdc++.h>using......
  • 题解:P3113 [USACO14DEC] Marathon G
    用线段树维护子路径的长度和这条子路径上删除一个点能够减少的最大距离。那么,修改就修改线段树上对应位置的值,查询就求这一段子路径的距离和子路径上删除一个点能够减少的最大距离,两者相减即可得到答案。代码:#include<bits/stdc++.h>usingnamespacestd;typedefpair<int,in......
  • 题解:P10961 划分大理石
    设\(f_x\)表示拼成\(x\)后,当前的大理石最多还能剩下几块,不能拼成就是\(-1\)。状态转移(当前考虑的大理石价值为\(i\),有\(x\)块):\(f_j=x(f_j\ge0)\)本来就可以拼成,那么现在的大理石都可以剩下。\(f_j=f_{j-i}-1(f_j=-1,j\gei,f_{j-i}>0)\)本来不能拼成,但用了一块就能拼......
  • AGC026D Histogram Coloring 题解
    [AGC026D]HistogramColoring题解给定\(n\)列的网格,每列高为\(h_i\),将每个格子染色成红色或蓝色,使得每个\(2\times2\)的区域都恰好有两个蓝格子和两个红格子,求方案数(对\(10^9+7\)取模)。\(1\leqn\leq100,1\leqh_i\leq10^9\)性质为了方便讲述,先假设\(h_i=h_{i+......
  • P2657 [SCOI2009] windy 数 题解
    枚举、预处理,len-1位,len位但小于第一个数的这些都不讲了,看这篇题解windy讲一下贴近最高位的处理。因为最高位如果取了,后面位数只能取到最高位,而不是9,而后面的数也是同理,所以我们的内部$\j\$循环枚举范围要把\(num_i\)单独拿出来判,单独拿出来的原因是好判break一些,因为已......
  • AGC005D ~K Perm Counting 题解
    [AGC005D]~KPermCounting题解如果一个排列\(P\)满足对于所有的\(i\)都有\(|P_i-i|\neqk\),则称排列\(P\)为合法的。现给出\(n\)和\(k\),求有多少种合法的排列。由于答案很大,请输出答案对\(924844033\)取模的结果。\(2\leqn\leq2\times10^3\),\(1\leqk\leqn......