洛谷P1004 [NOIP2000 提高组] 方格取数 四维动态规划

[AcWing] 方格取数速看复习 方格取数 题目 设有 N×N 的方格图,我们在其中的某些方格中填入正整数,而其它的方格中则放入数字0。如下图所示: 在这里插入图片描述 某人从图中的左上角 A 出发,可以向下行走,也可以向右行走,直到到达右下角的 B 点。 在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字0)。 此人从 A 点到 B 点共走了两次,试找出两条这样的路径,使得取得的数字和为最大。 输入格式 第一行为一个整数N,表示 N×N 的方格图。 接下来的每行有三个整数,第一个为行号数,第二个为列号数,第三个为在该行、该列上所 阅读详情

保持沉默,是你的自由。

题目链接
题目描述
设有 N×N 的方格图 (N<=9),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字 0。如下图所示(见样例):
在这里插入图片描述
某人从图的左上角的 A点出发,可以向下行走,也可以向右走,直到到达右下角的 B点。在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字 0)。
此人从 A 点到 B点共走两次,试找出 2 条这样的路径,使得取得的数之和为最大。

输入格式
输入的第一行为一个整数 N(表示 N*N的方格图),接下来的每行有三个整数,前两个表示位置,第三个数为该位置上所放的数。一行单独的 0表示输入结束。

输出格式
只需输出一个整数,表示 2条路径上取得的最大的和。

输入输出样例
输入
8
2 3 13
2 6 6
3 5 7
4 4 14
5 2 21
5 6 4
6 3 15
7 2 14
0 0 0

输出
67

一开始的思路:
每走到一个位置,有两种选择,向下或向右,那怎么选择向下或向右呢?我觉得应该比较这个位置的右边和还有左边和,哪个大就往哪边走,然后把走过的位置变成0,再用这种算法走一遍
在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
int a[10][10];
int main(){
	int n,i,j;
	cin>>n;
	for(i=1;i<=n;i++){
		for(j=1;j<=n;j++){
			a[i][j]=0;
		}
	}
	int x,y,z;
	while(1){
	  cin>>x>>y>>z;
	  a[x][y]=z;
	  if(x==0) break;
	}
	int cnt=0;
	int rx=1,ry=1;
	if(a[1][1]!=0){
		cnt+=a[1][1];
		a[1][1]=0;
	} 
	while(rx<=n&&ry<=n){
		int sumx=0,sumy=0;
		for(i=ry+1;i<=n;i++){
			sumx+=a[rx][i];
		}
		for(i=rx+1;i<=n;i++){
			sumy+=a[i][ry];
		}
		if(sumx>=sumy) ry=ry+1;
		else if(sumx<sumy) rx=rx+1;
		if(a[rx][ry]!=0) {
			cnt+=a[rx][ry];
			a[rx][ry]=0; 
		}
	}
	rx=1,ry=1;
	while(rx<=n&&ry<=n){
		int sumx=0,sumy=0;
		for(i=ry+1;i<=n;i++){
			sumx+=a[rx][i];
		}
		for(i=rx+1;i<=n;i++){
			sumy+=a[i][ry];
		}
		if(sumx>=sumy) ry=ry+1;
		else if(sumx<sumy) rx=rx+1;
		if(a[rx][ry]!=0) {
			cnt+=a[rx][ry];
			a[rx][ry]=0; 
		}
	}
	cout<<cnt<<endl;
	return 0;
}

然后只得了40分
发现这种算法是不对的,比如这个样例就过不了:
0 10 7 4 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 3 0 0 0 0 0
0 0 6 0 0 0 0 0 0
5 0 7 0 3 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
最大33
走完一遍走第二遍的时候
0 0 0 4 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 3 0 0 0 0 0
0 0 0 0 0 0 0 0 0
5 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
按我的算法最大是5,但其实可以走4+3
于是看一下题目标签,发现是动态规划
然后我又开始了dp
设两个dp函数,先dp一遍,记录路径(自己写出记录路径还觉得自己是个天才,我真傻比),顺着路径逆推把走过的置0,再走一遍

#include<bits/stdc++.h>
using namespace std;
int f1[10][10],f2[10][10],p[10][10];
int a[10][10];
int main(){
	int n,i,j;
	cin>>n;
	for(i=1;i<=n;i++){
		for(j=1;j<=n;j++){
			a[i][j]=0;
		}
	}

	int x,y,z;
	while(1){
	  cin>>x>>y>>z;
	  a[x][y]=z;
	  if(x==0) break;
	}
	
     for(i=1;i<=n;i++){
     	f1[1][i]=a[1][i]+f1[1][i-1];
     	f1[i][1]=a[i][1]+f1[i-1][1];
	 }
	 for(i=2;i<=n;i++){
	 	for(j=2;j<=n;j++){
	 	 if(f1[i-1][j]>=f1[i][j-1]){
	 	 	f1[i][j]=f1[i-1][j]+a[i][j];
	 	 	p[i][j]=1;
		  }
	 	 else{
	 	 	f1[i][j]=f1[i][j-1]+a[i][j];
	 	 	p[i][j]=0;
		  }
		 }
	 }
	 if(a[n][n]!=0) a[n][n]=0;
	 int rx=n,ry=n;
	 while(rx>=1&&ry>=1){
	 	if(p[rx][ry]==1){
	 		a[rx-1][ry]=0;
	 		rx=rx-1;
		 }
		 else if(p[rx][ry]==0){
		 	a[rx][ry-1]=0;
		 	ry=ry-1;
		 }
		 if(rx==1&&ry==1) break;
	 }

	  for(i=1;i<=n;i++){
     	f2[1][i]=a[1][i]+f2[1][i-1];
     	f2[i][1]=a[i][1]+f2[i-1][1];
	 }
	 for(i=2;i<=n;i++){
	 	for(j=2;j<=n;j++){
	 	 if(f2[i-1][j]>=f2[i][j-1]){
	 	 	f2[i][j]=f2[i-1][j]+a[i][j];
	 	 	p[i][j]=1;
		  }
	 	 else{
	 	 	f2[i][j]=f2[i][j-1]+a[i][j];
	 	 	p[i][j]=0;
		  }
		 }
	 }
	 cout<<f1[n][n]+f2[n][n]<<endl;
	return 0;
}

这个想法,非常的好,然后得了80分。。
这个样例就过不了
0 0 2 3 0 0 0
0 0 3 0 0 0 0
0 0 3 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 4 0 0
0 0 0 0 4 0 0
0 0 2 0 4 0 0
最大20
dp走完一遍
0 0 0 3 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 2 0 0 0 0
最大3
加起来23,正确答案25
哦,我想了下,如果第一遍不取最大,第二遍再走,其实是能取到所有数的,所以还是不对
最后我就去看题解了,发现世界上居然有四维dp这种东西,震惊
所以这道题的正解应该是四维dp+特判,哎。真的无语了。

#include<bits/stdc++.h>
using namespace std;
int f[10][10][10][10];
int a[10][10];
int main(){
	int n,i,j,k,l;
	cin>>n;
	for(i=1;i<=n;i++){
		for(j=1;j<=n;j++){
			a[i][j]=0;
		}
	}
	int x,y,z;
	while(1){
	  cin>>x>>y>>z;
	  a[x][y]=z;
	  if(x==0) break;
	}
    for(i=1;i<=n;i++){
    	for(j=1;j<=n;j++){
    		for(k=1;k<=n;k++){
    			for(l=1;l<=n;l++){
    				f[i][j][k][l]=max(f[i-1][j][k-1][l],max(f[i-1][j][k][l-1],max(f[i][j-1][k-1][l],f[i][j-1][k][l-1])))+a[i][j]+a[k][l];
    				if(i==k&&j==l) f[i][j][k][l]-=a[i][j];//如果某个位置两条路径重合了,只能加一个的数
				}
			}
		}
	}
    cout<<f[n][n][n][n]<<endl;

	return 0;
}

又要感慨吾生也有涯知也无涯了,再多做点题吧

洛谷P1004 方格取数 洛谷P1004 方格取数 一道DP题,虽然数据范围很小,但还是需要多思考思考。作为NOIP 2000 提高组第四题,还是需要构思的。 题目描述 设有N \times NN×N的方格图(N \le 9)(N≤9),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字00。如下图所示(见样例): 某人从图的左上角的AA点出发,可以向下行走,也可以向右走,直到到达右下角的BB点。在走过的路上,他... 阅读详情

相关推荐

DDS信号发生器设计避坑指南:从AD9834配置到巴特沃斯滤波实战

本文详细解析了基于AD9834芯片的DDS信号发生器设计中的关键技术要点与常见陷阱,涵盖时钟源选择、寄存器配置时序、巴特沃斯滤波器设计等核心内容。针对中高频段信号质量优化,提供了实用的解决方案和代码示例,帮助工程师规避设计误区,提升信号发生器的性能和稳定性。

2y3u4i5o6p的博客 782

【动态规划】方格取数 (ssl 1010)

方格取数方格取数方格取数 Description 设有N*N的方格图(N&amp;amp;amp;amp;amp;lt;=10,我们将其中的某些方格中填入正整数,而其他的方格中则放入数字0。如下图所示(见样例): 某人从图的左上角的A 点出发,可以向下行走,也可以向右走,直到到达右下角的B点。在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字0)。 此人从A点到B 点共走两次,试找出2条这样的路径,使得取得的数之和为最大。 ...

ssllyf的博客 1000

课设报告-超市收银系统 javaweb(附源代码)

超市收银系统由收银员输入顾客的会员卡卡号(若有卡),所购买的货号。从数据库中取出有关价格信息,在把这些信息返回给收银台,同时把收银台的销售总量和有关种类商品的剩余量以及该持卡顾客的消费情况交数据库存储以供查询。另外,对没有卡的消费不记录该顾客的消费情况扥个人信息,如果一个未持卡顾客一次购买满200元,可围棋发放一张会员卡,以后在该商场购物可享受9折优惠。

m0_71106830的博客 2975

P1004 [NOIP2000 提高组] 方格取数

某人从图的左上角的A点出发,可以向下行走,也可以向右走,直到到达右下角的B点。在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字0)。 此人从A点到B点共走两次,试找出2条这样的路径,使得取得的数之和为最大。...

zjsru_Beginner的博客 887

用VASPKIT+Quantum Espresso高效绘制能带图:从K点路径生成到可视化全流程

本文详细介绍了如何整合VASPKIT与Quantum Espresso(QE)软件,构建一套高效的能带计算与可视化工作流。通过VASPKIT自动化生成高对称K点路径,结合QE完成自洽与非自洽计算,并利用gnuplot绘制发表级能带图。该流程极大提升了材料电子结构研究的效率与可重复性,是进行DFT能带计算的实用指南。

weixin_29294975的博客 163

基于云平台的ATS系统微服务架构方案研究

在当前智慧地铁的升级转型过程中,城市轨道交通ATS系统面临着稳定性差、运维方 式繁琐和故障应急处理效率低等问题。为此,提出一种基于云平台的ATS系统微服务架构方案; 研究了ATS系统在云平台上的微服务总体架构、ATS应用的微服务划分和设计、容器部署方式 及通信交互模式,可实现系统松耦合和易扩展,达到节约计算资源、提高系统稳定性和运营效 率的目的

mi_lan1的博客 966

洛谷 P1004 [NOIP2000 提高组] 方格取数

P1004 [NOIP2000 提高组] 方格取数题目答案注意推荐文章 题目 设有 N \times NN×N 的方格图 (N \le 9)(N≤9),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字 00。如下图所示(见样例): A **加粗样式**0 0 0 0 0 0 0 0 0 0 13 0 0 6 0 0 0 0 0 0 7 0 0 0 0 0 0 14 0 0 0 0 0 21 0 0 0 4 0 0 0 0

ljhsq的博客 772

Vertx之Grpc消息发送

介绍 Vert.x gRPC 模块,它将 Google gRPC 的编程风格与 Vert.x 风格保持一致. gRPC 是一个高性能、开源、通用的RPC框架,是一种进程间通讯技术,由Google推出,基于HTTP2协议标准设计开发,默认采用Protocol Buffers数据序列化协议,支持多种开发语言。gRPC提供了一种简单的方法来精确的定义服务,并且为客户端和服务端自动生成可靠的功能库。 在gRPC客户端可以直接调用不同服务器上的远程程序,使用姿势看起来就像调用本地程序一样,轻松的实现远端服务的连接、

Lance 1188

蓝桥杯 格子取数 (双线程 动态规划)-------C语言—菜鸟级

/* 题目描述 设有N*N的方格图(N&amp;lt;=10),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字0。 某人从图的左上角的A 点(1,1)出发,可以向下行走,也可以向右走,直到到达右下角的B点(N,N)。在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字0)。 此人从A点到B 点共走两次,试找出2条这样的路径,使得取得的数之和为最大。 输入   输入的第一行为...

Five—菜鸟级的博客 984

微信开放标签wx-open-launch-app样式失效?手把手教你正确设置点击区域(附完整代码)

本文详细解析了微信开放标签`wx-open-launch-app`样式失效和点击无响应的常见问题,提供了完整的解决方案和代码示例。通过分析标签内部实现机制,指导开发者正确设置点击区域和样式,确保跨平台兼容性和用户体验优化。

joy55的博客 320

【异常】OpenClaw认证 Please carry the API secret key in the ‘Authorization‘ field of the request header

OpenClaw助手Agent因401认证异常导致业务中断的排查方案。该异常由大模型API鉴权全量失败触发,主要根因包括API凭证配置错误、密钥过期、账号权限不足或请求格式不规范。解决方案分四级:优先校验并修正API密钥;排查账号状态与调用权限;检查请求格式规范;最后排查网络或服务商问题。建议建立密钥生命周期管理机制,定期监控额度,使用专用API密钥以规避类似问题。该异常属于凭证配置类故障,不影响系统稳定性。

奶爸的编程之路,也就一周冷个三天 465

洛谷P1004 [NOIP2000 提高组] 方格取数

洛谷P1004 [NOIP2000 提高组] 方格取数 题目传送门 看到这道题差点手痒写暴搜…… 我们定义一个四维数组f[i][j][k][d]同时枚举两条路。一个四重循环枚举两条路分别走到的位置。由于每个点均从上或左继承而来,故内部有四个if,分别表示两个点从上上、上左、左上、左左继承来时,加上当前两个点所取得的最大值。如果i=k&&j=d就减去一个格。 AC代码: #include<bits/stdc++.h> using namespace std; int f[15][1

Melancholy的博客 225

Vue3 - 手机移动端H5网页强力解决弹起软键盘后页面被挤压变形或页面整体上移问题,点击input输入框键盘弹出底部被上推往上顶遮挡及各种问题(兼容安卓苹果ios手机,微信公众号网页微信内置浏览器)

vue3,h5网页,input输入框组件,vue3 h5软键盘弹出,vue3输入框,键盘弹起时页面整体上移问题,uni,H5页面,解决软键盘弹起页面被挤压、被往顶的问题,解决vue3输入框,键盘弹起时页面整体上移问题,vue3调用手机系统软键盘,页面窗口被顶起,布局定位失效,解决VUE3软键盘弹起导致页面fixed定位元素被顶上去,输入法软键盘弹起,窗口顶起,变形解决办法,Vue中input组件在IOS设备上弹出软键盘时页面整体上移问题的解决方案,以及input组件聚焦后弹出软键盘固定在,Vue3软键盘把界

🏆 前端领域优质创作者 1万+

洛谷[P1004]方格取数

洛谷[P1004]方格取数 题目描述 设有N*N的方格图(N<=9),我们将其中的某些方格中填入正整数,而其他的方格中则放 人数字0。如下图所示(见样例): A 0 0 0 0 0 0 0 0 0 0 13 0 0 6 0 0 0 0 0 0 7 0 0 0 0 0 0 1...

weixin_30537391的博客 62

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

洛谷P1004方格取数(多维DP)

四维DP

nuc_ghp的博客 2781

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

洛谷P1004(方格取数[NOIP 2000 提高组])题解

洛谷P1004详解15000字

2201_75316840的博客 1319

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

P1004 NOIP2000 提高组 方格取数

分析到这个地方,这题已经很好做了。根据上面的第一种讨论,可以写出一个记忆化搜索;而根据第二种讨论,很容易写出一种四维 DP。两点分别出发,那么有个问题就是不确定性,计算的时候不可控因素很多。另外,根据题意,同一个方格最多只能取一次,所以要判断坐标重叠的情况。与 [[小烈送菜]] 算姐妹题了,这个辈分甚至更老一点。点同时出发,路径可以交叉,求从方格中取数的最大总和。接下来,分类讨论一下可能的情况。那么这道题就可以转化为两个人从。如果直接按照题目,从。

weixin_46760324的博客 814

【洛谷】P1004 [NOIP2000提高组]方格取数

如果各个子问题不是独立的(即重复的),且不同子问题的个数是有限的,那么如果我们可以保存已经解决的子问题的答案,而在需要时再找出已经求得的答案,这样就可以避免大量的重复计算,以此减少时间复杂度。2.dp[m1][n1][m2][n2]处的最大取数值取决于四个值中的最大值,分别为两个路径各自从左、上两个方向传入的值。在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字 0)。输入的第一行为一个整数 N(表示 N×N 的方格图),接下来的每行有三个整数,前两个表示位置,第三个数为该位置上所放的数。

2302_80216196的博客 825

洛谷 P1004 方格取数

洛谷 P1004 方格取数 题目描述 设有N \times NN×N的方格图(N \le 9)(N≤9),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字00。如下图所示(见样例): A 0 0 0 0 0 0 0 0 0 0 13 0 0 6 0 0 0 0 0 0 7 0 0 0 0 0 0 14 0 0 0 ...

anynever的博客 344

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

多维动态规划

Clouding_Yu的博客 1206

洛谷 P1004 [NOIP 2000 提高组] 方格取数

某人从图的左上角的 A 点出发,可以向下行走,也可以向右走,直到到达右下角的 B 点。在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字 0)。输入的第一行为一个整数 N(表示 N×N 的方格图),接下来的每行有三个整数,前两个表示位置,第三个数为该位置上所放的数。设有 N×N 的方格图 (N≤9),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字 0。此人从 A 点到 B 点共走两次,试找出 2 条这样的路径,使得取得的数之和为最大。NOIP 2000 提高组 T4。

2401_87918203的博客 423

NOIP 2000 方格取数

洛谷 P1004 方格取数 https://www.luogu.org/problemnew/show/P1004 JDOJ 2791: [NOIP2000]方格取数 T4 https://neooj.com:8082/oldoj/problem.php?id=2791 题目描述 设有N*N的方格图(N<=10,我们将其中的某些方格中填入正整数,而其他的方格中则放入数...

anhaoti3785的博客 204
上一篇: 洛谷P1908 逆序对 树状数组 离散化
下一篇: 2021辽宁省赛 I 完美主义 树状数组/暴力
Sc0214_
博客等级 码龄6年 14粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值