首页 > 其他分享 >P1004 [NOIP2000 提高组] 方格取数 题解

P1004 [NOIP2000 提高组] 方格取数 题解

时间:2023-12-13 22:57:32浏览次数:36  
标签:std 10 NOIP2000 val int 题解 P1004 dp

P1004 [NOIP2000 提高组] 方格取数 题解

题目链接

P1004 [NOIP2000 提高组] 方格取数

简要思路

注意一下输入可以简化为

while(std::cin>>x>>y>>val&&x){
	//***
}

运用 DP 的思想。

用一个四维的 \(DP\) 数组 \(dp[i][j][k][l]\) 来同时记录两条路径分别走到 \((i,j)\) 和 \((k,l)\) 时的累加最大值。

至于转移方程,每条路径都有从上往下走和从左往右走两种情况,那么两条路径合起来就有四种情况,我们对这四种情况取最大值即可。

即:

dp[i][j][k][l]=std::max(std::max(dp[i-1][j][k-1][l],dp[i-1][j][k][l-1]),std::max(dp[i][j-1][k-1][l],dp[i][j-1][k][l-1]));

对于当前位置的数值对 DP 数组的贡献,我们可以让其先加上两个路径走到的位置的值,即:

dp[i][j][k][l]+=a[i][j]+a[k][l];

当重合的时候(即 \(i,k\) 相等且 \(j,l\) 相等),由于一个位置的数值只能对答案贡献一次,所以当重合时我们要减去当前的位置的数值。

完整代码

#include<bits/stdc++.h>
#define int long long
#define endl '\n'

int n;
int x,y,val;
int a[10][10];
int dp[10][10][10][10];//共同处理两条路径

signed main(){
	std::cin>>n;
	while(std::cin>>x>>y>>val&&x!=0)
		a[x][y]=val;//预处理输入矩阵

	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			for(int k=1;k<=n;k++)
				for(int l=1;l<=n;l++){
					dp[i][j][k][l]=std::max(std::max(dp[i-1][j][k-1][l],dp[i-1][j][k][l-1]),std::max(dp[i][j-1][k-1][l],dp[i][j-1][k][l-1]))+a[i][j]+a[k][l];//dp 数组的转移
					if(i==k&&j==l)dp[i][j][k][l]-=a[i][j];//重合时减去一个
				}
	std::cout<<dp[n][n][n][n]<<endl;//两条路径分别到达了 (n,n)
	return 0;
}

标签:std,10,NOIP2000,val,int,题解,P1004,dp
From: https://www.cnblogs.com/CheZiHe929/p/17900121.html

相关文章

  • P4463 [集训队互测 2012] calc 题解
    Description一个序列\(a_1,a_2,\dots,a_n\)是合法的,当且仅当:\(a_1,a_2,\dots,a_n\)都是\([1,k]\)中的整数。\(a_1,a_2,\dots,a_n\)互不相等。一个序列的值定义为它里面所有数的乘积,即\(a_1\timesa_2\times\dots\timesa_n\)。求所有不同合法序列的值的和对\(p\)......
  • CF213E Two Permutation 题解
    CF213ETwoPermutations题解题意:给出两个排列$a,b$,长度分别为\(n,m\),你需要计算有多少个$x$,使得\(a_1+x,a_2+x,...a_n+x\)是\(b\)的子序列。\(n\leqm\leq2\times10^5\)分析:一个很自然的思路是直接枚举\(x\),然后只保留\(b\)中值域在\([x+1,x+n]\)......
  • 记一次 Zabbix agent is not available 问题解决
    好久没折腾zabbix,最近遇到一个奇葩的问题,忽然有一台服务器报警“Zabbixagentisnotavailable(ornodatafor30m)”,但是查看监控数据都有,而且在不断的更新开始分析问题、解决问题:1、先检查了一遍配置,都没问题2、检查了一遍server端和agent端的日志,也没有相应的错......
  • CF1500F Cupboards Jumps 题解
    题目链接点击打开链接题目解法感觉是一个融合了许多技巧的题,很巧妙题目要求\(\max(h_i,h_{i+1},h_{i+2})-\min(h_i,h_{i+1},h_{i+2})=w_i\),这可以转化成另一个只和两项有关的形式为:\(\max(|h_i-h_{i+1}|,|h_i-h_{i+2}|,|h_{i+1}-h_{i+2}|)=w_i\)令\(d_i=h_{i+1}-h_i\),所以......
  • springboot-micrometer潜在oom问题解决办法
    在服务中起一个监听Prometheus拉取的线程,在拉取完成之后清理调meterMap中内容比较多的tag,我这边是清理调gateway.requests.代码如下:@ComponentpublicclassPrometheusMeterRegistryFactory{@ResourceprivatePrometheusMeterRegistryprometheusMeterRegistry;......
  • CTFpwnAD世界pwnstack题解及栈溢出两种解法
    问题的出现这题我刚看到时差点没笑出来,但是尝试了一次之后我就笑不出来了。这题给了back_door后门函数,但是如果直接覆盖返回到后门函数起始位置会出现栈溢出问题。到这一步都没有出现问题,而继续ni的话就会卡住。基本上这里看到xmm0就是栈对其问题了。出现问题原因很简单,linux系统一......
  • 【洛谷 P1271】【深基9.例1】选举学生会 题解(计数排序)
    【深基9.例1】选举学生会题目描述学校正在选举学生会成员,有名候选人,每名候选人编号分别从1到,现在收集到了张选票,每张选票都写了一个候选人编号。现在想把这些堆积如山的选票按照投票数字从小到大排序。输入格式输入和以及个选票上的数字。输出格式求出排序后的选票编......
  • CTFpwnAD世界dice_game题解wp
    惯例checksec一下看看main首先seed函数用时间生成一个随机数,这个随机数做为srand函数的参数让srand函数生成一个种子。(这个种子会影响后面的rand函数生成结果,并且同样的种子会使rand函数生成同样的随机数,就是所谓的伪随机)以及看到这里会有连续五十轮游戏。sub_A20这里就是每一轮......
  • [ARC106F] Figures 题解
    题目链接点击打开链接题目解法这么神仙的推式子题看到生成树计数,第一反应是\(prufer\)序列考虑在\(prufer\)序列上搞这个东西可以得到\(ans=\sum\limits_{\sum\limits_{i=1}^nd_i=n-2}\binom{n-2}{d_1,d_2,...,d_n}\times\proda_i^{\underline{d_i+1}}\)考虑拆式子......
  • 问题解决
    howtomeasuressolutionsaddresstheimportanceofspeaking abilityandhowtodevelopit.Astherapid developmentofglobalization,itisofgreatnecessityforyoungstertoimproveourspeakingability.Howtoaddressthisproblem?Thefollowingsoluti......