虽说是 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过河卒的更多相关文章

  1. 洛谷 P1002过河卒

    洛谷 P1002过河卒 题目描述 棋盘上AA点有一个过河卒,需要走到目标BB点.卒行走的规则:可以向下.或者向右.同时在棋盘上CC点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点 ...

  2. 洛谷P1002 过河卒 [2017年4月计划 动态规划15]

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

  3. 洛谷P1002——过河卒

    又是洛谷题,要不是有小姐姐不会,我才不想动脑子.先贴一下题目地址https://www.luogu.org/problem/P1002 再贴一下题目: 我们读一下题目,这可不比学校的**算法题,读完一 ...

  4. 洛谷[P1002]过河卒

    原题地址:https://www.luogu.org/problemnew/show/P1002 题目描述 棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下.或者向右.同时在棋盘上C点 ...

  5. 洛谷P1002 过河卒

    关于蒟蒻的我,刚刚接触DP....   那么就来做一道简单DP吧.... 首先先看题: 题目描述 棋盘上AA点有一个过河卒,需要走到目标BB点.卒行走的规则:可以向下.或者向右.同时在棋盘上CC点有一 ...

  6. 洛谷 P1002 过河卒 【棋盘dp】

    题目链接:https://www.luogu.org/problemnew/show/P1002 题目描述 棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下.或者向右.同时在棋盘上C点 ...

  7. 洛谷P1002 过河卒 题解 动态规划

    题目链接:https://www.luogu.com.cn/problem/P1002 题目大意 棋盘上\(A\)点有一个过河卒,需要走到目标\(B\)点.卒行走的规则:可以向下.或者向右.同时在棋盘 ...

  8. 洛谷P1002 过河卒【dp】

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

  9. 洛谷——P1002 过河卒||codevs——T1010 过河卒

    https://www.luogu.org/problem/show?pid=1002#sub||http://codevs.cn/problem/1010/ 题目描述 棋盘上A点有一个过河卒,需要走 ...

随机推荐

  1. 使用Xpath爬取酷狗TOP500的歌曲信息

    使用xpath爬取酷狗TOP500的歌曲信息, 将排名.歌手名.歌曲名.歌曲时长,提取的结果以文件形式保存下来.参考网址:http://www.kugou.com/yy/rank/home/1-888 ...

  2. jQuery---内容复习

    内容复习 1. 操作样式 (5) 1.1 css操作 设置单个样式 设置多个样式 获取样式 css(name, value) :设置单个样式 css(obj):设置多个样式 css(name):获取样 ...

  3. springboot里面的缓存注解

    https://blog.csdn.net/u012240455/article/details/80844361 https://lfvepclr.gitbooks.io/spring-framew ...

  4. 假期学习【十一】Python切词,以及从百度爬取词典

    今天主要对从CSDN爬取的标题利用jieba(结巴)进行分词,但在分词过程中发现,如大数据被分成了大/数据,云计算被分隔成了云/计算. 后来又从百度百科--->信息领域爬取了相关词语作为词典,预 ...

  5. python接口自动化-requests-toolbelt处理multipart/form-data

    1.requests-toolbelt官方文档:https://pypi.org/project/requests-toolbelt/ 2.环境安装 pip install requests-tool ...

  6. cf 手机短信问题

    题目链接:https://vjudge.net/contest/331120#problem/C 题目:你有一部手机,最多显示k个人发的信息,现在收到n条信息,有可能人是相同的人发的.最新的要顶置,当 ...

  7. springboot项目集成activity

    1.按照上一篇博客,新建好springboot项目后,在项目pom.xml文件中添加activity依赖 <dependency> <groupId>org.activiti& ...

  8. 记录 Docker 的学习过程 (安装基础篇)

    docker 通过内核来实现 特点是效率高 1. centos7 三台(推荐2c 4g 最低 1c1g)2. 关闭防火墙 selinux3. 做好主机名解析,三台能互相ping通主机名host参考文件 ...

  9. Wannafly Camp 2020 Day 7H 游戏 - 欧拉筛,GCD

    忘记特判 \(1\) ,血了一地 听说 \(O(n^2 \log n)\) 能过? #include <bits/stdc++.h> #define int long long using ...

  10. yii2表单提交CSRF验证

    Yii2表单提交默认需要验证CSRF,如果CSRF验证不通过,则表单提交失败,解决方法如下: 第一种解决办法是关闭Csrf public $enableCsrfValidation = false; ...