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

【NOIP提高组】方格取数

【NOIP提高组】方格取数


💖The Begin💖点点关注,收藏不迷路💖

设有N*N的方格图,我们将其中的某些方格填入正整数, 而其他的方格中放入0。 某人从图得左上角出发,可以向下走,也可以向右走,直到到达右下角。 在走过的路上,他取走了方格中的数。(取走后方格中数字变为0) 此人从左上角到右下角共走3次,试找出3条路径,使得取得的数总和最大。

输入:

第一行:N (4< =N< =20) 接下来一个N*N的矩阵,矩阵中每个元素不超过80,不小于0

输出:

一行,表示最大的总和。

样例输入:

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

样例输出:

30
#include <stdio.h>
#include <stdlib.h>#define MAX_N 10  // 定义最大值常量int n;  // 定义整数变量n
int a[MAX_N + 1][MAX_N + 1];  // 定义二维数组a
int f[(MAX_N * 2) + 1][MAX_N + 1][MAX_N + 1];  // 定义三维数组fint main() {int i, j, k, x, y;  // 定义整数变量i, j, k, x, yscanf("%d", &n);  // 从标准输入读取n的值// 读取i, j, k的值,直到i为0,将k赋值给a[i][j]while (scanf("%d%d%d", &i, &j, &k), i != 0) {a[i][j] = k;}f[1][1][1] = a[1][1];  // 将a[1][1]的值赋给f[1][1][1]// 循环计算最大路径和for (k = 2; k < (n * 2); k++) {for (i = 1; i <= k && i <= n; i++) {for (j = 1; j <= k && j <= n; j++) {// 计算x的值if (i == j) {x = a[i][k + 1 - i];} else {x = a[i][k + 1 - i] + a[j][k + 1 - j];}y = f[k - 1][i][j];  // 初始化y为f[k-1][i][j]// 更新y为四个方向的最大值if (f[k - 1][i - 1][j - 1] > y) {y = f[k - 1][i - 1][j - 1];}if (f[k - 1][i][j - 1] > y) {y = f[k - 1][i][j - 1];}if (f[k - 1][i - 1][j] > y) {y = f[k - 1][i - 1][j];}f[k][i][j] = x + y;  // 计算当前位置的最大路径和}}}printf("%d\n", f[n * 2 - 1][n][n]);  // 输出最终结果return 0;  
}

这段代码实现的是一个动态规划算法,用于求解一个二维矩阵中从起点到终点的最大路径和。

1、首先,我们定义了一个二维数组 a 用于存储输入的矩阵。然后,我们定义了一个三维数组 f 作为状态数组,用于存储每个位置的最大路径和。

2、接下来,我们遍历 k,表示路径长度。对于每个 k 值,我们使用三重循环遍历矩阵的每个位置 (i, j),其中 ij 分别表示当前位置的行和列。

在每个位置 (i, j),我们根据不同的情况计算出路径长度为 k 时的最大路径和:

  • 如果 i 等于 j,说明当前位置在矩阵的主对角线上,此时路径长度为 k 的最大路径和等于当前位置的值 a[i][k+1-i]
  • 如果 i 不等于 j,说明当前位置不在主对角线上,此时路径长度为 k 的最大路径和等于当前位置的值 a[i][k+1-i] 加上位置 (i, j) 左上方和右上方两个位置的最大路径和中的较大值。

3、最后,我们输出 f[n*2-1][n][n],即路径长度为 n*2-1(矩阵中元素数的两倍减一)时,终点位置 (n, n) 的最大路径和。

该算法通过动态规划的思想,利用已计算出的较小路径长度的最大路径和,逐步推导得到较大路径长度的最大路径和,最终得到了问题的解。

在这里插入图片描述


💖The End💖点点关注,收藏不迷路💖

相关文章:

  • 如何将静态TCP/IP路由添加到Windows路由表?这里提供方法
  • Java线程中sleep()和wait()有什么区别
  • 基于docker的oracle12.2.0.1部署及oracle使用与docker镜像容器制作迁移方法
  • 寄存器、缓存、内存(虚拟、物理地址)、DDR、RAM的关系
  • 超大功率光伏并网逆变器学习(三相) 一
  • FPGA实现多路并行dds
  • 第15届蓝桥杯国赛JavaA组个人题解
  • 华为坤灵管理型交换机S300,S500,S310,S210,S220,S200 web端开局配置
  • 【C++题解】1438 - 骑士巡游
  • 线程同步的技术难点
  • vue2 bug 小白求助!!!(未解决,大概是浏览器缓存的问题或者是路由的问题)
  • 【C#】委托和事件
  • leetcode hot100强化练习 0 - 35
  • 华为S5700交换机版本升级步骤
  • Android中ANR的分析和解决
  • AHK 中 = 和 == 等比较运算符的用法
  • Codepen 每日精选(2018-3-25)
  • ES6简单总结(搭配简单的讲解和小案例)
  • Java知识点总结(JavaIO-打印流)
  • js正则,这点儿就够用了
  • LeetCode18.四数之和 JavaScript
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • Python_OOP
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • SQL 难点解决:记录的引用
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • 从零搭建Koa2 Server
  • 代理模式
  • 今年的LC3大会没了?
  • 聚类分析——Kmeans
  • 前端性能优化--懒加载和预加载
  • 前端之React实战:创建跨平台的项目架构
  • 为什么要用IPython/Jupyter?
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • 数据可视化之下发图实践
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • #APPINVENTOR学习记录
  • $.ajax()方法详解
  • (02)vite环境变量配置
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (C11) 泛型表达式
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (分布式缓存)Redis持久化
  • (回溯) LeetCode 78. 子集
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (面试必看!)锁策略
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • .bat批处理(五):遍历指定目录下资源文件并更新