动态规划入门之二维数组的动态规划(过河卒)

news2024/11/15 18:44:25

P1002 [NOIP2002 普及组] 过河卒 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

过河卒,首先科普一下象棋里面的马的跳跃一步的规则吧(这题真够坑人的,连个规则都不给出,害得我第一次交就全wa)。一张图解释

 

大家看所有标记为p的点的坐标就是马跳一步和原来的位置。解决这个问题之后,我们大家来想怎么做,从起点怎么到达终点,一个好想的思路是我们使用深搜dfs从起点来出发不断搜索,遇到封锁点换到另一个路线,最终到达终点。我们开个变量记录到达终点的总路线。本题由于只是向右和向下并不需要标记位置。但是显然会超时。给一下深搜的代码:


import java.awt.FontFormatException;
import java.io.BufferedReader; 
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.lang.reflect.AnnotatedWildcardType;
import java.math.BigInteger;
import java.net.DatagramPacket;
import java.sql.SQLIntegrityConstraintViolationException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.Map;
import java.util.Objects;
import java.util.PriorityQueue;
import java.util.Scanner;
import java.util.Spliterator.OfPrimitive;
import java.util.function.IntToDoubleFunction;
import java.util.function.LongBinaryOperator;
import java.util.TreeMap;
import java.util.TreeSet;
import javax.management.relation.InvalidRelationTypeException;
import javax.print.attribute.standard.JobMessageFromOperator;
import javax.print.attribute.standard.JobPriority;
import javax.swing.plaf.ColorChooserUI;
import javax.swing.table.TableModel;
import javax.swing.text.TabSet;
import javax.xml.crypto.dsig.spec.DigestMethodParameterSpec;
public class Main {
  public static void main(String[] args) throws IOException  {
Scanner sc=new Scanner(System.in);
BufferedReader br1=new BufferedReader(new InputStreamReader(System.in));
PrintWriter pw1=new PrintWriter(System.out);
String[] aStrings=br1.readLine().split(" ");
xx=Integer.parseInt(aStrings[0]);
yy=Integer.parseInt(aStrings[1]);
visited=new int[xx+1][yy+1];
int a=Integer.parseInt(aStrings[2]);
int b=Integer.parseInt(aStrings[3]);
visited[a][b]=-1;
int c,d;
int e=a-2;
int f=b-1;
if(e>=0&&e<=xx&&f>=0&&f<=yy) {
	visited[e][f]=-1;
}
int e1=a-1;
int f1=b-2;
if(e1>=0&&e1<=xx&&f1>=0&&f1<=yy) {
	visited[e1][f1]=-1;
}
int e2=a+1;
int f2=b-2;
if(e2>=0&&e2<=xx&&f2>=0&&f2<=yy) {
	visited[e2][f2]=-1;
}
int e3=a+2;
int f3=b-1;
if(e3>=0&&e3<=xx&&f3>=0&&f3<=yy) {
	visited[e3][f3]=-1;
}
int e4=a-2;
int f4=b+1;
if(e4>=0&&e4<=xx&&f4>=0&&f4<=yy) {
	visited[e4][f4]=-1;
}
int e5=a-1;
int f5=b+2;
if(e5>=0&&e5<=xx&&f5>=0&&f5<=yy) {
	visited[e5][f5]=-1;
}
int e6=a+1;
int f6=b+2;
if(e6>=0&&e6<=xx&&f6>=0&&f6<=yy) {
	visited[e6][f6]=-1;
}
int e7=a+2;
int f7=b+1;
if(e7>=0&&e7<=xx&&f7>=0&&f7<=yy) {
	visited[e7][f7]=-1;
}
dfs(0, 0);
System.out.println(answer);


  }
  public static int xx;
  public static int yy;
  public static int[] xx1= {0,-1,0,1};
  public static int[] yy1= {-1,0,1,0};
  public static int[][] visited;
  public static long answer=0;
public static void dfs(int a,int b) {
	if(a==xx&&b==yy) {
		answer++;
		return;
	}
	int c;
	for(c=2;c<=3;c++) {
		int x=a+xx1[c];
		int y=b+yy1[c];
		if(x>=0&&x<=xx&&y>=0&&y<=yy) {
			if(visited[x][y]!=-1) {
				dfs(x, y);
			}
		}
	}
}
		  
 }
 

超时了:

 这提示我们比赛时实在不会dp可以写dfs来骗分吗。(蓝桥专属)

(ps:蒟蒻只会dfs骗分,我哪会一开始就写dp还不是看了正解代码才会的)

回归正解,我们考虑dp做法。由于dfs超时了,我们考虑使用dp。因为本题

只能向右走和向下走,所以任何一个点,如果它可以被走到(这个点不是被封锁的点),那么它一定是从其上方的点和其左边的点走到的,那么我们的状态转移方程也就有了。

dp[i][j]=dp[i-1][j]+dp[i][j-1];

不过有鉴于我们的dp通常从1,1开始,所以我们默认将所有的位置都加上1,起点从(1,1)开始。顺便确定边界条件,我们直到起点为(1,1)那么我们从起点开始,假设终点就是(1,1)那肯定就只有一条路径。也就是说从起点开始路径就一条。根据我们的状态转移方程来判断,我们只需把(0,1)或(1,0)中的一个位置变为1即可。顺便如果遇到封锁点,我们直接把它赋值为0即可。

上代码:


import java.awt.FontFormatException;
import java.io.BufferedReader; 
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.lang.reflect.AnnotatedWildcardType;
import java.math.BigInteger;
import java.net.DatagramPacket;
import java.sql.SQLIntegrityConstraintViolationException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.Map;
import java.util.Objects;
import java.util.PriorityQueue;
import java.util.Scanner;
import java.util.Spliterator.OfPrimitive;
import java.util.function.IntToDoubleFunction;
import java.util.function.LongBinaryOperator;
import java.util.TreeMap;
import java.util.TreeSet;
import javax.management.relation.InvalidRelationTypeException;
import javax.print.attribute.standard.JobMessageFromOperator;
import javax.print.attribute.standard.JobPriority;
import javax.swing.plaf.ColorChooserUI;
import javax.swing.table.TableModel;
import javax.swing.text.TabSet;
import javax.xml.crypto.dsig.spec.DigestMethodParameterSpec;
public class Main {
  public static void main(String[] args) throws IOException  {
Scanner sc=new Scanner(System.in);
BufferedReader br1=new BufferedReader(new InputStreamReader(System.in));
PrintWriter pw1=new PrintWriter(System.out);
String[] aStrings=br1.readLine().split(" ");
xx=Integer.parseInt(aStrings[0]);
yy=Integer.parseInt(aStrings[1]);
visited=new long[xx+2][yy+2];
int a=Integer.parseInt(aStrings[2]);
int b=Integer.parseInt(aStrings[3]);
a=a+1;
b=b+1;
visited[a][b]=-1;
int c,d;
int e=a-2;
int f=b-1;
if(e>=0&&e<=xx+1&&f>=0&&f<=yy+1) {//这些if都是枚举封锁点,蒟蒻懒得写数组了,大家不要学我
	visited[e][f]=-1;
}
int e1=a-1;
int f1=b-2;
if(e1>=0&&e1<=xx+1&&f1>=0&&f1<=yy+1) {
	visited[e1][f1]=-1;
}
int e2=a+1;
int f2=b-2;
if(e2>=0&&e2<=xx+1&&f2>=0&&f2<=yy+1) {
	visited[e2][f2]=-1;
}
int e3=a+2;
int f3=b-1;
if(e3>=0&&e3<=xx+1&&f3>=0&&f3<=yy+1) {
	visited[e3][f3]=-1;
}
int e4=a-2;
int f4=b+1;
if(e4>=0&&e4<=xx+1&&f4>=0&&f4<=yy+1) {
	visited[e4][f4]=-1;
}
int e5=a-1;
int f5=b+2;
if(e5>=0&&e5<=xx+1&&f5>=0&&f5<=yy+1) {
	visited[e5][f5]=-1;
}
int e6=a+1;
int f6=b+2;
if(e6>=0&&e6<=xx+1&&f6>=0&&f6<=yy+1) {
	visited[e6][f6]=-1;
}
int e7=a+2;
int f7=b+1;
if(e7>=0&&e7<=xx+1&&f7>=0&&f7<=yy+1) {
	visited[e7][f7]=-1;
}
dp=new long[xx+2][yy+2];
dp[0][1]=1;

for(int i=1;i<=xx+1;i++) {
	for(int j=1;j<=yy+1;j++) {
		if(visited[i][j]==-1) {//把封锁点标记为-1,遇到封锁点我们赋值为0表示不能走
			dp[i][j]=0;
		}
		else
		dp[i][j]=dp[i-1][j]+dp[i][j-1];
	}
}
System.out.println(dp[xx+1][yy+1]);
//记得dp开long

  }
  public static int xx;
  public static int yy;
  public static long[][] visited;
  public static long[][] dp;
  public static int answer=0;


		  
 }
 

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

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

相关文章

Nvidia Jetson 编解码开发(4)H265解码图像异常问题调试

1. 前言 基于此贴继续验证H265图像 Nvidia Jetson 编解码开发(3)解决H265解码报错“PPS id out of range”_free-xx的博客-CSDN博客 ffmpeg解码后图像颜色异常 2. 梳理YUV格式顺序 相机输出图像格式: YUV422 8bit, UYVY 由于编码模块输入必须是 YUV420, 不能是YUV…

SpringCloud Ribbon中的7种负载均衡策略

SpringCloud Ribbon中的7种负载均衡策略 Ribbon 介绍负载均衡设置7种负载均衡策略1.轮询策略2.权重策略3.随机策略4.最小连接数策略5.重试策略6.可用性敏感策略7.区域敏感策略 总结 负载均衡通器常有两种实现手段&#xff0c;一种是服务端负载均衡器&#xff0c;另一种是客户端…

内网渗透神器CobaltStrike之权限提升(七)

Uac绕过 常见uac攻击模块 UAC-DLL UAC-DLL攻击模块允许攻击者从低权限的本地管理员账户获得更高的权限。这种攻击利用UAC的漏洞&#xff0c;将ArtifactKit生成的恶意DLL复制到需要特权的位置。 适用于Windows7和Windows8及更高版本的未修补版本 Uac-token-duplication 此攻…

软件测试开发实战|接口自动化测试框架开发(pytest+allure+aiohttp+用例自动生成)

近期准备优先做接口测试的覆盖&#xff0c;为此需要开发一个测试框架&#xff0c;经过思考&#xff0c;这次依然想做点儿不一样的东西。 接口测试是比较讲究效率的&#xff0c;测试人员会希望很快能得到结果反馈&#xff0c;然而接口的数量一般都很多&#xff0c;而且会越来越…

鼎友餐饮信息总监杨山海:餐饮新增长依托数智应用,用数字化打造单店盈利模型

杨山海 鼎友餐饮信息总监 近20年餐饮行业信息化、数字化决策经验&#xff0c;曾担任新辣道、雕刻时光、青年餐厅、快乐蜂、鲜果时间信数化负责人&#xff0c;主抓数字化转型、系统选型、多接口系统管理等&#xff0c;拥有丰富的餐饮行业数字化转型经验。 2000年&#xff0c;杨…

vue快捷生成初始代码模板

1.在 vscode 中找到如图设置->代码片段->vue.json 2.配置默认值 {"vue3": {"prefix": "vue3","body": ["<template>"," <div></div>","</template>","",&qu…

【HCIP】09.路由引入

路由引入&#xff1a;路由优先级 路由引入&#xff1a;路由回灌 场景描述 R1访问目标地址5.5.5.5&#xff0c;如果数据发给R3就会形成路由回灌R1访问5.5.5.5时&#xff0c;查询路由表&#xff0c;发现5.5.5.5是R3将ISIS引入产生的路由&#xff0c;则将下一跳指向R3R3收到数据包…

arm:day7

1.软中断处理 .text 文本段 .global _start 声明一个_start全局函数的入口 _start: _start标签&#xff0c;就是c语言的函数 1.构建异常表b resetb undefb softwareb prefetchb datab irqb fiqreset: 2.系统上电&#xff0c;程序运行在svc模式 初始化svc模式的栈指针ldr sp,0x4…

财报解读:“三驾马车”驱动,劲仔食品能否越跑越快?

国内休闲零食市场上半年表现喜人。 8月以来&#xff0c;多家休闲零食上市公司发布半年报告或预告&#xff0c;纷纷迎来利润增长。盐津铺子预计2023年上半年实现扣除非经常性损益后的净利润2.26亿元至2.36亿元&#xff0c;同比增长98.89%至107.69%&#xff1b;甘源食品预计2023…

【Java转Go】快速上手学习笔记(四)之基础篇三

目录 泛型内置泛型的使用切片泛型和泛型函数map泛型泛型约束泛型完整代码 接口反射协程特点WaitGroupgoroutine的调度模型&#xff1a;MPG模型 channel介绍语法&#xff1a;举例&#xff1a;channel遍历基本使用和协程一起使用案例一案例二 select...casemain.go 完整代码 文件…

备份服务器搭建

备份服务器搭建 1、背景2、作用3、选型4、环境5、部署5.1、服务端部署5.1.1、安装5.1.2、配置 5.2、客户端部署5.3、备份策略5.3.1、定时备份策略5.3.2、文件变动备份 6、参考 1、背景 随着项目的推进&#xff0c;备份服务器被提上了工作日程&#xff0c;等保、密评和接入测评…

三层交换机实验

要求&#xff1a; 目录 1、IP规划 2、交换机的配置 2.1 Eth-Trunk通道&#xff08;将多个接口逻辑的整合成一个接口&#xff0c;实现带宽叠加的作用&#xff09; 2.2 创建VLAN&#xff08;所有交换机只创建VLAN2&#xff0c;默认有VLAN1&#xff09; 2.3 创建trunk干道…

PHP“牵手”拼多多商品详情数据获取方法,拼多多API接口批量获取拼多多商品详情数据说明

拼多多商品详情接口 API 是开放平台提供的一种 API 接口&#xff0c;它可以帮助开发者获取拼多多商品的详细信息&#xff0c;包括商品的标题、描述、图片等信息。在拼多多电商平台的开发中&#xff0c;拼多多详情接口 API 是非常常用的 API&#xff0c;因此本文将详细介绍拼多多…

6.RocketMQ之文件查询索引文件IndexFile

根据消息ID来查找消息&#xff0c;consumequeue 中没有存储消息ID,如果不采取其他措施&#xff0c;又得遍历 commitlog文件了&#xff0c;indexFile就是为了解决这个问题的文件。 如图所示&#xff1a; 一个indexFile对应一个40个字节的IndexHead。(40,2000 0000]区间代表存放…

【深入解析:数据结构栈的魅力与应用】

本章重点 栈的概念及结构 栈的实现方式 数组实现栈接口 栈面试题目 概念选择题 一、栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶&#xff0c;另一端称为栈底。栈中的数…

行政区划表设计和多级查询

简介 行政区划的表为一个多层级结构&#xff0c;设计大同小异&#xff0c;大致结构如下所示 其中&#xff0c;code为区划编号&#xff08;主键&#xff09;&#xff0c;parent_code为父区划编号&#xff0c;ancestors为祖区划编号&#xff0c;查询也主要围绕前两个展开。 查询…

【后端】Core框架版本和发布时间以及.net 6.0启动文件的结构

2023年&#xff0c;第35周&#xff0c;第1篇文章。给自己一个目标&#xff0c;然后坚持总会有收货&#xff0c;不信你试试&#xff01; .NET Core 是一个跨平台的开源框架&#xff0c;用于构建现代化的应用程序。它在不同版本中有一些重要的区别和发布时间 目录 一、Core版本和…

新研究:Gartner 公有云成本管理框架

2023年6月28日&#xff0c;Gartner 出版了名为《Beyond FinOps: the Gartner Framework for Public Cloud Financial Management》的公有云成本管理框架&#xff0c;旨在帮助企业/组织应对公有云支出的挑战&#xff0c;同时抓住新机遇&#xff0c;推动更有效的 IT 使用。新框架…

【HCIP】05.OSPF邻居与邻接关系

报文 OSPF头部 报文头部中影响邻居关系建立的字段是Router ID、Area ID、AuType HELLO报文 报文中影响建立邻居关系到是 hello time时间&#xff0c;DR优先级等 DD报文 序列号&#xff0c;LSA头部摘要信息I位&#xff1a;第一个报文&#xff0c;用于主从选举M位&#xff1a;…

跨境电商企业新宠Telegram使用指南,这个功能你不能忽视

Telegram是一款消息传递应用&#xff0c;以其隐私和安全性以及作为移动应用的易用性而闻名。截至 2023年 6月&#xff0c;它拥有超过7亿月活跃用户&#xff0c;是全球下载量排名前五的应用之一。随着其受欢迎程度的不断提高&#xff0c;该渠道正在全球企业中得到认可。让我们来…