首页 > 其他分享 >【csp2020】 方格取数 题解

【csp2020】 方格取数 题解

时间:2023-08-03 15:26:52浏览次数:39  
标签:down dp2 dp1 题解 up 取数 max csp2020 dp

洛谷传送门

1.题目大意

给定一个 \(n*m\) 的矩阵,矩阵中每个点 \((i,j)\) 都有一个权值 \(f_{(i,j)}\)。每次可以向上,向下或向右走。问从 \((1,1)\) 走到 \((n,m)\),经过的路径上点的权值之和最大是多少?

2.思路

这道题我们不难想到动态规划。但是与一般的动规不同的是,本题中有上下右三种走法,因此不能用一般的 \(dp\) 解决。

因此我们可以采用化繁为简的策略,即将三种走法分解成 向上、向右向下、向右 两种方法,分别存在数组 \(dp1[]\) 和 \(dp2[]\) 中。

即用 \(dp1_{(i,j)}\) 表示从 \(i\) 到 \(j\) 只用向下和向右两种走法能凑出的最大值,用 \(dp2_{(i,j)}\) 表示从 \(i\) 到 \(j\) 只用向上和向右两种走法能凑出的最大值。

然后本题还有一个易错点就是,因为可以向上和向下但又要保持不能走重复点,所以应该一列一列从左往右推,也可以理解为将矩阵 \(90\) 度翻转一下,然后一行一行从上往下推。

对于第二列开始的每一个点,我们先将其 \(dp\) 值赋值为 由它前一列的同一行向右走一格所得到的价值,即

\[dp1_{(i,j)} = dp2_{(i,j)} = max (dp1_{(i,j-1)}, dp2_{(i,j-1)}) + a_{(i,j)}; \]

然后我们再分别考虑向上或向下走得到的价值,并与之前得到的初始值取较大值:

\[dp1_{(i,j)} = max (dp1_{(i,j)}, dp1_{(i-1,j)} + a_{(i,j)}); \]

\[dp2_{(i,j)} = max (dp2_{(i,j)}, dp2_{(i+1,j)} + a_{(i,j)}); \]

最后,问题的答案就是两种走法得到权值的最大值。

3.注意事项

  • 1.因为我们是从第二列开始跑 \(dp\),所以要先初始化第一列,第一列的 \(dp\) 值就是其对应点的权值;

  • 2.因为 \(dp\) 数组需要取最大值,所以要先将其初始值赋为一个很小的值;

  • 3.因为图中最多会有 \(10^6\) 个点,且每个点权值最大为 \(10^4\),也就是说答案的最大值为 \(10^10\)。因此我们需要开 \(long\) \(long\);

  • 4.在统计往上走的 \(dp\) 值时,因为是从下往上更新,所以要使用倒序循环枚举。

4.代码

#include <iostream>
#include <algorithm>
#include <cstring>
#define int long long
//不开long long见祖宗!!!
using namespace std;

#define N 1010
#define For(i,j,k) for(int i=j;i<=k;i++)
#define IOS ios::sync_with_stdio(),cin.tie(),cout.tie()

int n, m, a[N][N], dp_up[N][N], dp_down[N][N];

void init () {
	For (i, 1, n) {
		For (j, 1, n) {
			dp_up[i][j] = dp_down[i][j] = -1e18;
		}
	} //将全图初始值赋为一个很小的值
	dp_up[1][1] = a[1][1];
	dp_down[1][1] = a[1][1]; //将出发点 dp 值赋为 a[1][1]
	return ;
}

signed main() {
	IOS;
	cin >> n >> m;

	For (i, 1, n) {
		For (j, 1, m) {
			cin >> a[i][j];
		}
	}

	init (); //初始化 dp 数组

	For (i, 2, n) {
		dp_up[i][1] = dp_up[i - 1][1] + a[i][1];
		dp_down[i][1] = dp_down[i - 1][1] + a[i][1];
	} //初始化第一列,其值为其上面的数的 dp 值加上这个点的权值。

	For (j, 2, m) {
		For (i, 1, n) {
			int t = max (dp_up[i][j - 1], dp_down[i][j - 1]);
			dp_up[i][j] = dp_down[i][j] = t + a[i][j];
		} //将其先赋值为上一列同一行的数往右走一步得到的价值

		For (i, 2, n) {
			int t = dp_up[i - 1][j] + a[i][j];
			dp_up[i][j] = max (dp_up[i][j], t);
		} //模拟向下走得到的价值,将其与向右走得到的价值取 max

		for (int i = n - 1; i >= 1; i --) {//因为往上走要先更新下面点的 dp 值,所以需要倒序循环。
			int t = dp_down[i + 1][j] + a[i][j];
			dp_down[i][j] = max (dp_down[i][j], t);
		} //模拟向上走得到的价值,将其与向右走得到的价值取 max
	}
	
	//答案为方案1的最大价值与方案2的最大价值中的较大值
	cout << max (dp_up[n][m], dp_down[n][m]) << endl;
	return 0;
}

标签:down,dp2,dp1,题解,up,取数,max,csp2020,dp
From: https://www.cnblogs.com/linbaicheng/p/17603395.html

相关文章

  • 【题解】Luogu[P5022] [NOIP2018 提高组] 旅行
    Link因为是道NOIP,那么我们不妨按照考场上的策略一点一点想。先看部分分,有一档有很明显的特征\(n=m-1\)这显然构成一棵树,对于一棵树,我们想把他按照题目的要求遍历完,一定是像dfs的遍历顺序一样,对于一个点,必然遍历完以它为根的子树,才能回到它的父亲节点,于是就有了一个很明显的贪......
  • RTMP流媒体服务器LntonMedia(免费版)视频平台在配置域名/公网的IP之后登陆一直显示服务
    LntonMedia是一款功能强大的视频平台,除了支持视频直播功能,还支持视频点播。它可以处理各种音视频文件,包括手机推流、演示视频、短频、音乐等。您可以通过多种上传方式将这些文件上传到平台上,支持批量上传和大文件上传。我们发现在LntonMedia配置了域名/公网ip后,在登录的时候发生了......
  • 关闭防火墙,主机与虚拟机VMnet8在同一网段,主机无法ping通虚拟机问题解决
    因需要进行oss数据迁移至eos,需要liunx环境,于是在本机上使用虚拟机安装了centos7,安装后ifconfig查看虚拟机ip,网络模式是NAT然后ping主机以及百度网,均可ping通,说明虚拟机网络正常  但是使用xshell后,一直无法连接,主机ping虚拟机,请求超时,以为是虚拟机防火墙问题,关闭虚拟机防火......
  • RTMP流媒体服务器LntonMedia(免费版)平台服务器性能扩张后重启但无法运行的问题解决方案
    LntonMedia支持一站式的上传、转码、直播、回放、嵌入、分享功能,具有多屏播放、自由组合、接口丰富等特点。平台可以为用户提供专业、稳定的直播推流、转码、分发和播放服务,全面满足超低延迟、超高画质、超大并发访问量的要求。在推流方面,LntonMedia支持手机推流,支持短视频、音乐等......
  • 记录使用uview的tabs组件初始化渲染下划线移位问题解决
    问题描述:初始化渲染后tabs的下划线没有居中对其,出现异位。问题分析: 网上很多大佬分析过出现原因了记录下解决的过程: 在各个论坛搜集到解决方案都暂时无效 有使用v-if重新渲染的  有给类赋值偏移值的 有强行转换px的因为各种原因这些方法在自己身上没有奏效所以记......
  • CCPC Changchun 2020 D, Meaningless Sequence题解
    听说是签到题。不难看出设x为i二进制个数下1的个数(还是难的),则a_i=c^x。那么我们只需要考虑所有0到n的个数。当n为1111时,可以得到为(1+c)^n次方,那么我们把答案看成两部分一部分是1到111...和1000到n,那么当si位为1时,可以看成是n去掉前一位后再乘以c,递推得到每一个位置的答案,就是......
  • 题解 SP15454
    前言数学符号约定\(\operatorname{lowbit}(x)\):表示\(x\)的二进制最低位。\([a,b]\):表示区间\(a\simb\),其中包含\(a,\,b\)端点,其区间长度为\(b-a+1\)。如非特殊说明,将会按照上述约定书写符号。题目大意有一个初始全为\(0\)的序列\(A\),你需要支持一下操作:add......
  • 题解 ARC104F
    前言在这里首先感谢一下题解区的FZzzz,本人的题解思路主要是基于他并给出了自己的理解。如非特殊说明,本题解中的数学符号原则上与题目中一致。题目分析需要转化的喵喵题。我们需要把原问题转化成一个图论计数问题,然后剩下的就很好办了。好,首先让我们修改一下题目的要求,将不......
  • 题解 AGC054D
    前言因为本人尚菜,所以本篇文章没有什么数学符号,请大家放心食用。题目分析先吐槽一嘴,这个o表示(),这个x表示)(,十分形象。好,我们先观察原序列,容易得出第一条性质:ox的加入不会让我们不合法的序列变合法,相反,它会让我们合法的序列变不合法。于是可以得出,无论如何,只要我们......
  • 题解 P9406【[POI2020-2021R3] Nawiasowania】
    一个显然的思路是:在排列\(p\)的括号串合法的基础上,使得左括号在原括号串中尽量靠左,这样答案更有可能合法。于是我们求出这个原括号尽量靠左的括号串(下文称为“最优括号串”),然后check合法性即可。下文中\(s\)是排列\(p\)的括号串。当\(n=2\)时,唯一的填法是令\(s_1\get......