【NC16708】过河卒

题目

过河卒

动态规划

思路

我们知道,小卒只能朝右或者下走,先假设没有对方的马。那么对于起点所在的行上的所有位置就只有一种不同路径,因为那些位置只能从左边到达(转换思维),同样那么对于起点所在的列上的所有位置也只有一种不同路径,因为那些位置只能从上边到达。所以,我们可以得到以下思路:

建立一个 n n n m m m 列的二维数组 d p dp dp,其中 d p [ i ] [ j ] dp[i][j] dp[i][j] 表示到达第 i i i 行第 j j j 列的不同路径种数,可知题目所求的答案就是 d p [ n ] [ m ] dp[n][m] dp[n][m]
对于 d p dp dp 数组的第一列和第一行(下标为 0 0 0),我们将其初始化为 1 1 1,然后从下标为 ( 1 , 1 ) (1,1) (1,1) 的格子开始依次遍历后续格子,根据上面的推导可以知道 d p [ i ] [ j ] = d p [ i − 1 ] [ j ] + d p [ i ] [ j − 1 ] dp[i][j]=dp[i-1][j]+dp[i][j-1] dp[i][j]=dp[i1][j]+dp[i][j1]

上面的思路针对没有对方的马的情况,但是这道题存在对方的一匹马,那又该怎么办呢?

我们知道,小卒不能通过对方马的控制点,也就是说,如果从左上角到右下角只要遇到控制点,那么控制点之右和控制点之下的位置就都不能到达了。而控制点本身对不同路径数目的贡献为 0 0 0,所以可以在 d p dp dp 数组中将所有的控制点都置为 0 0 0。这样,为了不让 d p dp dp 数组内的值产生混淆,即不知道该更新哪些点(因为控制点是不能更新的),所以在初始化的时候就先将整个 d p dp dp 数组全部置为 − 1 -1 1,然后将所有控制点都置为 0 0 0,然后更新的时候只更新值为 − 1 -1 1 的格子即可。

代码

#include <stdio.h>// 马所能到达的几个点的位置变化
const int TO[][2] = {{1, 2}, {1, -2}, {-1, 2}, {-1, -2},{2, 1}, {2, -1}, {-2, 1}, {-2, -1}};int main(void) {int n = 0, m = 0, x = 0, y = 0;scanf("%d%d%d%d", &n, &m, &x, &y);// 需要使用长整型存储long long dp[n + 1][m + 1];int i = 0, j = 0, tx = 0, ty = 0;// 初始时全部置为-1for (i = 0; i <= n; i++) {for (j = 0; j <= m; j++) {dp[i][j] = -1;}}// 然后将马能到达的点全部置为0dp[x][y] = 0;for (i = 0; i < 8; i++) {tx = x + TO[i][0];ty = y + TO[i][1];if (!(tx < 0 || tx > n || ty < 0 || ty > m)) {dp[tx][ty] = 0;}}// 对于第一行,从起点到第一个为0的点,全部置为1,意思为// 从起点走到该位置只有一种路径for (i = 0; i <= m; i++) {if (dp[0][i] == -1) {dp[0][i] = 1;} else {for (i++; i <= m; i++) {dp[0][i] = 0;}}}// 同样,对于第一列(除起点外)也采用同样的方式处理为 1for (i = 1; i <= n; i++) {if (dp[i][0] == -1) {dp[i][0] = 1;} else {for (i++; i <= n; i++) {dp[i][0] = 0;}}}// 从第2行(下标为1)第2列(下标为1)// 开始遍历,凡是空位(值为-1)的格子都将其置为// 上边格子的数 + 左边格子的数// 这是因为到某个格子只能从上面和左边到这个格子,那么到达这个格子的路径数目// 就等于到达上面格子的路径数目 + 到达左边格子的路径数目for (i = 1; i <= n; i++) {for (j = 1; j <= m; j++) {if (dp[i][j] == -1) {dp[i][j] = dp[i - 1][j] + dp[i][j - 1];}}}printf("%lld\n", dp[n][m]);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/790880.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Flutter】windows环境配置

windows 11 环境 官方教程 配置了flutter 环境变量在系统的path里 bin 路径。 死活没反应 关闭了git关闭了dart.exe关闭了vs还是不行卸载重新来 新版git flutter doctor 还需要android 环境

Web前端—(原生JS)购物车效果

目录 购物车效果分析数据单件商品的数据整个界面的数据 分析界面分析事件 购物车效果 先准备好原始数据和素材 在下面数据的基础上&#xff0c;编写index.js 分析数据 编写程序要从数据入手&#xff0c;从数据到界面最后到事件在分析数据的过程中&#xff0c;要分析数据是通过…

HarmonyOS NEXT应用开发之@Provide装饰器和\@Consume装饰器:与后代组件双向同步

Provide和Consume&#xff0c;应用于与后代组件的双向数据同步&#xff0c;应用于状态数据在多个层级之间传递的场景。不同于上文提到的父子组件之间通过命名参数机制传递&#xff0c;Provide和Consume摆脱参数传递机制的束缚&#xff0c;实现跨层级传递。 其中Provide装饰的变…

营销中的归因人工智能

Attribution AI in marketing 归因人工智能作为智能服务的一部分&#xff0c;是一种多渠道算法归因服务&#xff0c;根据特定结果计算客户互动的影响和增量影响。有了归因人工智能&#xff0c;营销人员可以通过了解每个客户互动对客户旅程每个阶段的影响来衡量和优化营销和广告…

x-cmd-pkg | broot 是基于 Rust 开发的一个终端文件管理器

简介 broot 是基于 Rust 开发的一个终端文件管理器&#xff0c;它设计用于帮助用户在终端中更轻松地管理文件和目录&#xff0c;使用树状视图探索文件层次结构、操作文件、启动操作以及定义您自己的快捷方式。 同时它还集成了 ls, tree, find, grep, du, fzf 等工具的常用功能…

Rredis缓存常见面试题

文章目录 1.什么是缓存穿透&#xff0c;怎么解决2.什么是缓存击穿&#xff0c;怎么解决3.什么是缓存雪崩&#xff0c;怎么解决4.双写一致性问题5.redisson添加的排他锁是如何保证读写、读读互斥的6.为什么不使用延迟双删7.redis做为缓存&#xff0c;数据的持久化是怎么做的8.re…

【信号处理】基于变分自编码器(VAE)的图片典型增强方法实现

关于 深度学习中&#xff0c;经常面临图片数据量较小的问题&#xff0c;此时&#xff0c;对数据进行增强&#xff0c;显得比较重要。传统的图片增强方法包括剪切&#xff0c;增加噪声&#xff0c;改变对比度等等方法&#xff0c;但是&#xff0c;对于后端任务的性能提升有限。…

ObjectiveC-08-OOP面向对象程序设计-类的分离与组合

本节用一简短的文章来说下是ObjectiveC中的类。类其实是OOP中的一个概念&#xff0c;概念上简单来讲类是它是一组关系密切属性的集合&#xff0c;所谓的关系就是对现实事物的抽象。 上面提到的关系包括很多种&#xff0c;比如has a&#xff0c; is a&#xff0c;has some等&…

小程序滑动删除组件+全选批量删除组件+附源码

小程序滑动删除组件全选批量删除组件附源码 说明 使用 uni-app、uview 组件开发&#xff0c;全端&#xff08;微信小程序、QQ小程序、抖音小程序等等&#xff09; 支持滑动删除组件、支持左滑删除、长按进入批量删除、全选删除、长按弹窗删除、 组件式开发&#xff0c;文章…

【VUE】ruoyi框架自带页面可正常缓存,新页面缓存无效

ruoyi框架自带页面可正常缓存&#xff0c;新页面缓存无效 背景&#xff1a; 用若依框架进行开发时&#xff0c;发现ruoyi自带的页面缓存正常&#xff0c;而新开发的页面即使设置了缓存&#xff0c;当重新进入页面时依旧刷新了接口。 原因&#xff1a;页面name与 getRouters …

使用的sql

根据CODE去重 SELECT * FROM ( SELECT count( camera_code ) AS count, camera_code FROM n_camera_basic GROUP BY camera_code ) t WHERE t.count >1 DELETE FROM n_camera_basic WHERE camera_id NOT IN (SELECT dt.minno…

外围极简便携式T12电烙铁(CH32X035)-第二篇

文章目录 系列文章目录前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 一、工程简介 原理图&#xff1a; PCB&#xff1a; 外壳&#xff1a; BOM&#xff1a; 二、功能模块介绍 1、 |----系统初始化 0&#xff1a;填写系统初值 …

OpenHarmony实战:Makefile方式组织编译的库移植

以yxml库为例&#xff0c;其移植过程如下文所示。 源码获取 从仓库获取yxml源码&#xff0c;其目录结构如下表&#xff1a; 表1 源码目录结构 名称描述yxml/bench/benchmark相关代码yxml/test/测试输入输出文件&#xff0c;及测试脚本yxml/Makefile编译组织文件yxml/.gitat…

水果销售(源码+文档)

水果销售管理系统&#xff08;小程序、ios、安卓都可部署&#xff09; 文件包含内容程序简要说明含有功能项目截图客户端添加地址首页商品详细意见反馈待发货商品分类我的代付款我的地址搜索防骗指南资料修改登录注册 后端管理分类管理反馈管理订单管理商品管理用户管理 文件包…

搜索与图论——拓扑排序

有向图的拓扑排序就是图的宽度优先遍历的一个应用 有向无环图一定存在拓扑序列&#xff08;有向无环图又被称为拓扑图&#xff09;&#xff0c;有向有环图一定不存在拓扑序列。无向图没有拓扑序列。 拓扑序列&#xff1a;将一个图排成拓扑序后&#xff0c;所有的边都是从前指…

C 字符串

在 C 语言中&#xff0c;字符串实际上是使用空字符 \0 结尾的一维字符数组。因此&#xff0c;\0 是用于标记字符串的结束。 空字符&#xff08;Null character&#xff09;又称结束符&#xff0c;缩写 NUL&#xff0c;是一个数值为 0 的控制字符&#xff0c;\0 是转义字符&…

CAD Plant3D 2023 下载地址及安装教程

CAD Plant3D是一款专业的三维工厂设计软件&#xff0c;用于在工业设备和管道设计领域进行建模和绘图。它是Autodesk公司旗下的AutoCAD系列产品之一&#xff0c;专门针对工艺、石油、化工、电力等行业的设计和工程项目。 CAD Plant3D提供了一套丰富的工具和功能&#xff0c;帮助…

计算机网络-HTTP相关知识-HTTP的发展

HTTP/1.1 特点&#xff1a; 简单&#xff1a;HTTP/1.1的报文格式包括头部和主体&#xff0c;头部信息是键值对的形式&#xff0c;使得其易于理解和使用。灵活和易于扩展&#xff1a;HTTP/1.1的请求方法、URL、状态码、头字段等都可以自定义和扩展&#xff0c;使得其具有很高的…

docker------docker入门

&#x1f388;个人主页&#xff1a;靓仔很忙i &#x1f4bb;B 站主页&#xff1a;&#x1f449;B站&#x1f448; &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;Linux &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#…

好用的Android Studio插件管理器

1.使用阿里云的通义灵码方便快速开发 1.1下载插件File->plugin->marketplace 搜索 Tongyilingma然后安装重启登录阿里云&#xff0c;确认 1.2 使用方法 输入信息描述 比如 //写一段冒泡排序然后换行&#xff0c;输入public/private/protected方法会自动生成联想代码…