每日OJ题_牛客_DP13[NOIP2002 普及组]过河卒_路径dp_C++_Java

news2024/11/27 8:27:44

目录

牛客_DP13[NOIP2002 普及组]过河卒_路径dp

题目解析

C++代码1

C++代码2

Java代码


牛客_DP13[NOIP2002 普及组]过河卒_路径dp

[NOIP2002 普及组] 过河卒_牛客题霸_牛客网 (nowcoder.com)

描述:

    棋盘上 A点有一个过河卒,需要走到目标 B点。卒行走的规则:可以向下、或者向右。同时在棋盘上 C 点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”。

棋盘用坐标表示,A 点 (0, 0)、B点(n,m),同样马的位置坐标是需要给出的。

        现在要求你计算出卒从 A点能够到达 B点的路径的条数,假设马的位置(x,y)是固定不动的,并不是卒走一步马走一步。


题目解析

简单路径 dp 问题:相当于是有障碍物的路径类问题,标记走到障碍物上的方法数为 0 即可。

C++代码1

#include <iostream>
#include <ostream>
#include <vector>
using namespace std;
#define int long long // 66666666666666666666666666666666666666666666
signed main()
{
	// 把马吃了是不是后面的点就能走了?emmm
	int n = 0, m = 0, x = 0, y = 0;
	cin >> n >> m >> x >> y;
	// if (n == 1 || m == 1) // 边界处理
	// {
	// 	cout << 1 << endl;
	// 	return 0;
	// }
	// if (abs(m - x) + abs(n - y) == 3 && m != x && n != y)
	// {
	// 	cout << 0 << endl;
	// 	return 0;
	// }
	// vector<vector<int>> borad(n, vector<int>(m));
	vector<vector<int>> dp(n + 1, vector<int>(m + 1, 0));
	for (int i = 0; i <= n; ++i)
	{
		if (abs(i - x) + abs(0 - y) == 3 && i != x && 0 != y)
			break;
		if (x == i && y == 0) // 马也不能走!!!真服了
			break;
		dp[i][0] = 1;
	}
	for (int j = 0; j <= m; ++j)
	{
		if (abs(0 - x) + abs(j - y) == 3 && 0 != x && j != y)
			break;
		if (x == 0 && y == j) // 马也不能走!!!真服了
			break;
		dp[0][j] = 1;
	}
	for (int i = 1; i <= n; ++i)
	{
		for (int j = 1; j <= m; ++j)
		{
			if (abs(i - x) + abs(j - y) == 3 && i != x && j != y)
				continue;
			if (x == i && y == j) // 马也不能走!!!真服了
				continue;
			dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
		}
	}
	// for(int i = 0; i <= n; ++i) // DeBug:打印dp矩阵
	// {
	// for(int j = 0; j <= m; ++j)
	// {
	// cout << dp[i][j] << " ";
	// }
	// cout << endl;
	// }
	cout << dp[n][m] << endl;
	return 0;
}

C++代码2

#include <iostream>
#include <ostream>
#include <vector>
using namespace std;
#define int long long // 66666666666666666666666666666666666666666666
signed main()
{
	// 把马吃了是不是后面的点就能走了?emmm
	int n = 0, m = 0, x = 0, y = 0;
	cin >> n >> m >> x >> y;
	// if (n == 1 || m == 1) // 边界处理
	// {
	// 	cout << 1 << endl;
	// 	return 0;
	// }
	// if (abs(m - x) + abs(n - y) == 3 && m != x && n != y)
	// {
	// 	cout << 0 << endl;
	// 	return 0;
	// }
	// vector<vector<int>> borad(n, vector<int>(m));
	vector<vector<int>> dp(n + 2, vector<int>(m + 2, 0));
	// for (int i = 0; i <= n; ++i)
	// {
	// 	if (abs(i - x) + abs(0 - y) == 3 && i != x && 0 != y)
	// 		break;
	// 	if (x == i && y == 0) // 马也不能走!!!真服了
	// 		break;
	// 	dp[i][0] = 1;
	// }
	// for (int j = 0; j <= m; ++j)
	// {
	// 	if (abs(0 - x) + abs(j - y) == 3 && 0 != x && j != y)
	// 		break;
	// 	if (x == 0 && y == j) // 马也不能走!!!真服了
	// 		break;
	// 	dp[0][j] = 1;
	// }
    dp[0][1] = 1;
    x += 1, y += 1;
	for (int i = 1; i <= n + 1; ++i)
	{
		for (int j = 1; j <= m + 1; ++j)
		{
			if (abs(i - x) + abs(j - y) == 3 && i != x && j != y)
				continue;
			if (x == i && y == j) // 马也不能走!!!真服了
				continue;
			dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
		}
	}
	// for(int i = 0; i <= n; ++i) // DeBug:打印dp矩阵
	// {
	// for(int j = 0; j <= m; ++j)
	// {
	// cout << dp[i][j] << " ";
	// }
	// cout << endl;
	// }
	cout << dp[n + 1][m + 1] << endl;
	return 0;
}

Java代码

import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main
{
    public static void main(String[] args) 
    {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt(), m = in.nextInt(), x = in.nextInt(), y = 
            in.nextInt();
        long[][] dp = new long[n + 2][m + 2];
        dp[0][1] = 1;
        x += 1; y += 1;
        for(int i = 1; i <= n + 1; i++)
        {
            for(int j = 1; j <= m + 1; j++)
            {
                if(i != x && j != y && Math.abs(i - x) + Math.abs(j - y) == 3
                   || (i == x && j == y))
                {
                    dp[i][j] = 0;
                }
                else
                {
                    dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
                }
            }
        }
        System.out.println(dp[n + 1][m + 1]);
    }
}

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

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

相关文章

总结一下 KNN、K-means 和 SVM【附代码实现】

小小总结一下 KNN、K-means 和 SVM 及其 Python 实现 好久没更新了&#xff0c;最近准备秋招&#xff0c;在机器学习中感觉经常被问的几个算法&#xff1a;K近邻算法&#xff08;K-Nearest Neighbors, KNN&#xff09;、K均值聚类算法&#xff08;K-means&#xff09;以及支持…

【网络通信基础与实践番外三】TCP的三次握手和四次挥手和例题

一、TCP连接的三次握手 第一次握手&#xff1a;客户端首先向服务器发送一个特殊的TCP报文&#xff0c;这个报文段首部不包含应用层数据&#xff0c;但是在报文段中有一个SYN标志位被置1。因此这个特殊的报文段也被叫做SYN报文段&#xff0c;然后客户端随机选择一个初始序列号&a…

【JWT安全】portswigger JWT labs 全解

目录 1.利用有缺陷的 JWT 签名验证 ①接受任意签名 lab1:通过未验证的签名绕过 JWT 身份验证 ②接受无签名的token lab2:通过有缺陷的签名验证来绕过 JWT 身份验证 2.暴力破解密钥 ①使用hashcat lab3:通过弱签名密钥绕过 JWT 身份验证 3.JWT 标头参数注入 ①通过 jwk…

kubevirt基于CDI创建虚拟机

CDI介绍 KubeVirt 的 Containerized Data Importer (CDI) 是一个 Kubernetes 原生的数据管理组件&#xff0c;专门为虚拟机 (VM) 提供存储支持&#xff0c;尤其在虚拟机的镜像管理和数据导入方面非常有用。CDI 的主要用途是帮助用户轻松地将外部数据源导入到 Kubernetes 集群中…

Linux线程(三)终止线程与回收线程详解

1.终止线程 在示例代码&#xff0c;我们在新线程的启动函数&#xff08;线程 start 函数&#xff09;new_thread_start()通过 return 返回之后&#xff0c;意味着该线程已经终止了&#xff0c;除了在线程 start 函数中执行 return 语句终止线程外&#xff0c;终止线程的方式还…

Qt基础之四十八:按钮为何会有点击效果

我们从一个最简单的Window API窗口程序开始说起。 一.一个最简单的Window API窗口程序 #include <windows.h> #include <wingdi.h> // 声明窗口过程函数 LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);int WINAPI WinMain(HI…

Windows程序包管理器WinGet的使用方法

Windows 程序包管理器 WinGet 命令行工具作为应用安装程序的一部分在 Windows 11 和现代版本的 Windows 10 上提供。 WinGet 工具的当前预览版支持以下命令: 命令说明info显示有关系统的元数据&#xff08;版本号、体系结构、日志位置等&#xff09;。 有助于进行故障排除。i…

电磁兼容(EMC):整改案例(四)人体对EFT测试影响有多大?

目录 1. 异常现象 2. 原因分析 3. 整改方案 4. 总结 1. 异常现象 某产品按GB/T 17626.4标准进行电快速瞬变脉冲群测试&#xff0c;测试条件为&#xff1a;频率5kHz/100kHz&#xff0c;测试电压L&#xff0c;N线间2kV&#xff0c;L&#xff0c;N线对PE线4kV。测试过程中需要…

Linux学习笔记(五):shell脚本,强大的文本处理工具awk,sed

Linux学习笔记&#xff08;五&#xff09;&#xff1a;shell脚本&#xff0c;awk&#xff0c;sed&#xff0c;服务管理 1. Shell 脚本 Shell 脚本是一种使用 Shell 编写的脚本&#xff0c;它可以在 Linux 系统中执行各种任务。 1.1 变量 声明变量&#xff1a; 使用 export 命令…

C++容器类型内置函数随笔

vector 容器 添加数据 vector <int> v ; v.push_back(数据); 访问数据的两个迭代器b.begin()和v.end() vector <int> :: iterator it_begin v. begin(); //容器起始位置元素的指针vector <int> :: iterator it_end v.end(); //指向容器最后一个元素下一…

FinOps三人行:云计算时代的FinOps 反模式和SRE(文字+视频版)

简介 9月20日&#xff0c;由SRE专委会和雅菲奥朗主办的“FinOps三人行&#xff1a;云计算时代的FinOps 反模式和SRE”在线研讨会成功举办&#xff0c;三位业界专家雅菲奥朗刘峰老师、易点天下董金老师和辛诺科技Larry老师齐聚一堂&#xff0c;聚焦于云计算环境下的并购模式、运…

Python编码规范与常见问题纠正

Python编码规范与常见问题纠正 Python 是一种以简洁和易读性著称的编程语言&#xff0c;因此&#xff0c;遵循良好的编码规范不仅能使代码易于维护&#xff0c;还能提升代码的可读性和可扩展性。编写规范的 Python 代码也是开发者职业素养的一部分&#xff0c;本文将从 Python…

Java-数据结构-Map和Set(三)-习题 o(´^`)o

目录 ❄️一、习题一(只出现一次的数字)&#xff1a; ❄️二、习题二(随机链表的复制)&#xff1a; ❄️三、习题三(宝石与石头)&#xff1a; ❄️四、习题四(旧键盘)&#xff1a; ❄️五、习题五(前k个高频单词)&#xff1a; ❄️总结&#xff1a; ❄️一、习题一(只出现一…

【Nacos架构 原理】内核设计之Nacos一致性协议

文章目录 Nacos一致性协议为什么需要一致性协议Nacos选择了Raft&#xff08;强一致性&#xff09;&Distro&#xff08;最终一致性&#xff09;服务发现角度配置管理角度 Nacos自研Distro协议背景设计思想数据初始化数据校验写操作读操作 Nacos一致性协议 为什么需要一致性…

大模型笔记05--coze经典案例分析

大模型笔记05--coze经典案例分析 介绍经典案例分析抖音视频转小红书文案艺术照 & 卡通照片助手艺术照图像流卡通照片图像流多功能图像助手 注意事项说明 介绍 扣子是新一代 AI 应用开发平台&#xff0c;具备完善的生态系统&#xff0c;是国内最出色的AI平台之一。用好coze…

C/C++/EasyX ——入门图形编程(2)

【说明】这一篇的内容都是很基础的&#xff0c;所以内容会很多&#xff0c;具体现在也不知道要写多少&#xff0c;先写下去吧&#xff0c;新手小白们都不用担心&#xff0c;这个内容不会很难&#xff0c;因为我也是从一无所知过来的&#xff0c;很好入门的&#xff0c;&#xf…

游览器输入URL并Enter时都发生了什么 面试完美回答

文章目录 前言URL解析DNS解析**浏览器缓存****操作系统缓存**&#xff1a;**路由器缓存**&#xff1a;ISP&#xff08;Internet service provider&#xff09;缓存DNS递归解析IP地址的获取缓存结果 建立TCP连接发送HTTP请求服务器响应TCP链接断开渲染页面解析一 HTML解析过程解…

带你快速了解后端API服务的搭建

前言&#xff1a;写这篇文章的初衷是想分享一下我学习搭建后端API的过程&#xff0c;希望能帮助到和我一样想快速写API接口并部署到服务器上的同学&#x1f61c; 第一步&#xff1a;创建阿里云服务器 1、首先注册一个阿里云账号&#x1f917; 2、出于学习成本考虑&#xff0…

Linux系统,docker容器内查看pikachu源代码

在Linux系统中&#xff0c;要查看Docker容器内的Pikachu的源代码&#xff0c;需要先确保Pikachu的Docker镜像已经运行在系统上。以下是步骤和示例代码&#xff1a; 1、查找Pikachu容器的ID或名称&#xff1a; docker ps -a 2、使用docker exec命令进入运行中的Pikachu容器&am…

Spring MVC的运行流程详解

Spring MVC作为一个广泛使用的框架&#xff0c;提供了灵活且强大的MVC架构支持。尤其在业务系统中&#xff0c;Spring MVC能够有效地处理大量并发请求&#xff0c;提供良好的用户体验。本文将详细讲解Spring MVC的运行流程&#xff0c;以电商交易系统为案例&#xff0c;帮助读者…