【做题笔记】洛谷P1002过河卒
虽说是 dp 入门题,但还是有很多细节需要注意
如果设 \(f_{x,y}\) 为目标地点为 \((x,y)\) 时走的种数,那么答案就是 \(f_{n,m}\)
在不考虑那只讨厌的马的情况下,对于任意一个坐标 \((i,j)\) ,它能走的方案数应该是从上面和左边走来,即 \(f_{i-1,j}\ +\ f_{i,j-1}\) 的值(从上面走来的方案数和从左边走来的和)。
此时天空一声巨响,一匹马闪亮登场,从题目所给的图中不难发现,这只马影响九个位置的值,使过河卒不能走
换而言之,马能走的地方,过河卒的统计应该直接跳过。
那么一个显而易见的思路:设一个数组 \(s\) ,在开始 dp 前初始化 \(s\) 数组,将马可能走到的坐标打上标记,然后在 dp 的时候如果当前坐标有这个标记就 \(\mathtt{continue}\) ,否则令 \(f_{i,j}\ =\ f_{i-1,j}\ +\ f_{i,j-1}\),初始化 \(f_{1,1}\) 为 \(1\) 。
然而 NOI plus 的出题人会这么良心么???显然非常凉心。如果这样干,一开始就这么干,就会导致初始化 \(f\) 数组的值被干掉,最后结果都是 \(0\) 。所以需要判断一下二者的大小,取较大的值,从而避免这个问题,即 \(f_{i,j}\ =\ \max(f_{i,j},f_{i-1,j}+f_{i,j-1})\)
然而 NOI plus 的出题人的心仅仅这么凉么???显然比这要凉得多。由于转移方程设计减法,会导致数组访问一个不存在的负数下标!!!其实解决方法也很简单,也就是把棋盘往下移。
最后记得开 \(\mathtt{long\ long}\) !!!
参考代码
#include <iostream>
#include <stdio.h>
#include <math.h>
#define ll long long
using namespace std;
ll f[101][101],n,m,mn,mm,s[230][230];
void stop(ll x,ll y)
{
s[x][y]=1;
s[x-1][y-2]=1;
s[x-2][y-1]=1;
s[x-2][y+1]=1;
s[x-1][y+2]=1;
s[x+1][y-2]=1;
s[x+2][y-1]=1;
s[x+1][y+2]=1;
s[x+2][y+1]=1;
}
//初始化 s 数组
int main()
{
scanf("%lld%lld%lld%lld",&n,&m,&mn,&mm);
n+=2,m+=2,mn+=2,mm+=2; //坐标下移
stop(mn,mm);
f[2][2]=1; //初始化下移
for(int i=2;i<=n;i++) //棋盘下移
{
for(int j=2;j<=m;j++) //棋盘下移
{
if(s[i][j]) continue;
f[i][j]=max(f[i][j],f[i-1][j]+f[i][j-1]);
}
}
printf("%lld\n",f[n][m]);
return 0;
}
【做题笔记】洛谷P1002过河卒的更多相关文章
- 洛谷 P1002过河卒
洛谷 P1002过河卒 题目描述 棋盘上AA点有一个过河卒,需要走到目标BB点.卒行走的规则:可以向下.或者向右.同时在棋盘上CC点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点 ...
- 洛谷P1002 过河卒 [2017年4月计划 动态规划15]
P1002 过河卒 题目描述 棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下.或者向右.同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点.因此称之 ...
- 洛谷P1002——过河卒
又是洛谷题,要不是有小姐姐不会,我才不想动脑子.先贴一下题目地址https://www.luogu.org/problem/P1002 再贴一下题目: 我们读一下题目,这可不比学校的**算法题,读完一 ...
- 洛谷[P1002]过河卒
原题地址:https://www.luogu.org/problemnew/show/P1002 题目描述 棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下.或者向右.同时在棋盘上C点 ...
- 洛谷P1002 过河卒
关于蒟蒻的我,刚刚接触DP.... 那么就来做一道简单DP吧.... 首先先看题: 题目描述 棋盘上AA点有一个过河卒,需要走到目标BB点.卒行走的规则:可以向下.或者向右.同时在棋盘上CC点有一 ...
- 洛谷 P1002 过河卒 【棋盘dp】
题目链接:https://www.luogu.org/problemnew/show/P1002 题目描述 棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下.或者向右.同时在棋盘上C点 ...
- 洛谷P1002 过河卒 题解 动态规划
题目链接:https://www.luogu.com.cn/problem/P1002 题目大意 棋盘上\(A\)点有一个过河卒,需要走到目标\(B\)点.卒行走的规则:可以向下.或者向右.同时在棋盘 ...
- 洛谷P1002 过河卒【dp】
棋盘上AA点有一个过河卒,需要走到目标BB点.卒行走的规则:可以向下.或者向右.同时在棋盘上CC点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点.因此称之为"马拦过河卒 ...
- 洛谷——P1002 过河卒||codevs——T1010 过河卒
https://www.luogu.org/problem/show?pid=1002#sub||http://codevs.cn/problem/1010/ 题目描述 棋盘上A点有一个过河卒,需要走 ...
随机推荐
- from selenium.webdriver.chrome.options import Options中add_argument 常用参数表收集
chrome_options.add_argument("xxx") 序号 参数 说明 1 --allow-outdated-plugins 不停用过期的插件. 2 --allow ...
- How to Install Oracle Java 11 on Ubuntu 18.04 LTS (Bionic) Written by Rahul, Updated on April 3, 20
本文系转载备份 请阅读点击下面链接阅读原文以获取更佳地阅读体验.谢谢. How to Install Oracle Java 11 on Ubuntu 18.04 LTS (Bionic) Writt ...
- react admin
react admin 管理后台的快速创建方式
- Max Sum Plus Plus HDU - 1024 基础dp 二维变一维的过程,有点难想
/* dp[i][j]=max(dp[i][j-1]+a[j],max(dp[i-1][k])+a[j]) (0<k<j) dp[i][j-1]+a[j]表示的是前j-1分成i组,第j个必 ...
- php文件上传 form表单形式
1.php界面 <?php header( 'Content-Type:text/html;charset=utf-8 ');include_once("conn/conn.php&q ...
- zabbix的web界面出现乱码解决方案
1.问题描述:当我们搭建好zabbix服务器后,查看监控信息时,发现数据显示的下端文字显示为乱码. 2.解决方式: (1)拷贝windows系统字体: 可根据各自的喜好进行选择,我这边就选择楷体 常规 ...
- [转]触发fullgc的条件
良好的状态是:minor gc比较多 full gc 比较少 因为fullgc时间比较慢,而且会占用CPU的时间片. 不好的状态是:minor gc比较少 full gc 比较多 这样程序就一直卡在f ...
- [0CTF 2016]piapiapia{PHP反序列化漏洞(PHP对象注入)}
先上学习链接: https://www.freebuf.com/column/202607.html https://www.cnblogs.com/ichunqiu/p/10484832.html ...
- 如来十三掌-关于不断解密的密码学,佛语解密,rot-13(根据13掌),base64
得到MzkuM3gvMUAwnzuvn3cgozMlMTuvqzAenJchMUAeqzWenzEmLJW9 然后尝试嘛 base64不太行 那根据十三掌??rot-13 得到ZmxhZ3tiZHNj ...
- HashMap,ConcurrentHashMap原理。Collection(list,set,map集合区别)。和CAS
collection里面有什么子类?(list和set是实现了collection接口的.) List: 1.可以允许重复的对象(可重复,有序集合).2.可以插入多个null元素.3.常用的实现类有 ...