当前位置: 首页 > news >正文

洛谷——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 14  0  0  0  0
 0 21  0  0  0  4  0  0
 0  0 15  0  0  0  0  0
 0 14  0  0  0  0  0  0
 0  0  0  0  0  0   0  0
                               B

某人从图的左上角的 A 点出发,可以向下行走,也可以向右走,直到到达右下角的 B 点。在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字 0)。

此人从 A 点到 B 点共走两次,试找出 2 条这样的路径,使得取得的数之和为最大。

【输入】

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

【输出】

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

样例输入

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

解题思路

这个题目首先可能会想到用动态二维 dp 解题,但是会出现一个问题这个不像搜索,走到之后就直接标记,然后后面是不会走到了,动态规划解题的特点是:如果要得到最小值或者,就不停的遍历并更新 dp 数组里面的值。但是这个题需要走两遍,而且走过的路上的数字要清空(注意这里并不是不能经过)。

用一个四维 dp 数组解决,四层循环查找一遍就可以得到答案。

代码如下:

#include<stdio.h>
int book[10][10];
int dp[10][10][10][10];//四维动态 dp数组 
int max(int x,int y)//求较大值的函数 
{if(x<y)return y;elsereturn x;
}
int main()
{int n,a,b,c,i,j,l,k;scanf("%d",&n);while(scanf("%d %d %d",&a,&b,&c)!=EOF){if(a==0&&b==0&&c==0)//一行单独的 0代表输入结束  break;book[a][b]=c;}for(i=1;i<=n;i++){for(j=1;j<=n;j++){for(l=1;l<=n;l++){for(k=1;k<=n;k++){dp[i][j][l][k]=book[i][j]+book[l][k]+max(max(dp[i][j-1][l][k-1],dp[i-1][j][l-1][k]),max(dp[i-1][j][l][k-1],dp[i][j-1][l-1][k]));if(i==l&&j==k)dp[i][j][l][k]-=book[i][j];}}			}}printf("%d\n",dp[n][n][n][n]);return 0;
} 

这个方法应该也是可行的:除了动态 dp 数组,除了存放方格中数的 book 数组,再设置一个 flag 数组(只能向下走或者向右走),它的下标代表每一列经过的行数,每更新一次 dp 数组里面的值,就把行数的下标存入对应的 flag 数组。

这样进行完第一遍查找后,找到了方格取数的最大值,并且标记了走过的路径,接下来把走过的路径上面的方格数归为 0,然后进行第二遍查找。

两遍查找的最大值相加就是要求的答案。

http://www.lryc.cn/news/5260.html

相关文章:

  • Linux删除软链接
  • 【自然语言处理】【大模型】用于大型Transformer的8-bit矩阵乘法介绍
  • 设计模式之工厂模式详解和应用
  • ArcGIS中的附件功能
  • epoll单台设备支持百万并发连接
  • 网络字节序
  • 03- SVC 支持向量机做人脸识别 (项目三)
  • 浅谈指向二维数组元素的指针变量
  • 左右值引用和移动语义
  • 一起学习用Verilog在FPGA上实现CNN----(七)全连接层设计
  • tomcat打debug断点调试
  • 如果持有互斥锁的线程没有解锁退出了,该如何处理?
  • 信息论绪论
  • Buffer Status Reporting(BSR)
  • 代码随想录LeetCode | 单调栈问题
  • C++之可调用对象、bind绑定器和function包装器
  • MongoDB--》文档查询的详细具体操作
  • 网络协议(六):网络层
  • 热启动预示生态起航的Smart Finance,与深度赋能的SMART通证
  • 提分必练,中创教育PMP全真模拟题分享
  • PID控制算法基础介绍
  • Ajax 学习笔记
  • ​力扣解法汇总1234. 替换子串得到平衡字符串​
  • C++关键字之const、inline、static
  • 【成为架构师课程系列】怎样进行概念架构(Conceptual Architecture)?
  • PostgreSQL的下载安装教程(macOS、Windows)
  • 98年的确实卷,公司新来的卷王,我们这帮老油条真干不过.....
  • 软件架构知识2-系统复杂度
  • JavaSE学习day4_02 数组(超级重点)
  • Theano教程:Python的内存管理