【做题笔记】洛谷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点有一个过河卒,需要走 ...
随机推荐
- css 字体旋转
<div v-else> <img src="/img/dashboard/nodata.png"> <div style="color: ...
- NOI Online能力测试游记:退役选手的自娱自乐
2020年2月17日早上8点,CCF发布了关于举办NOI Online能力测试的通知. 为给选手提供一个锻炼的机会,CCF拟举办一场NOI Online能力测试.测试分为入门组和提高组,每组限额报名3 ...
- unity踩坑2020-01-21
这几天一直在测试一个类似于传奇的2d界面游戏,目前做的测试为: 人物动作响应,主要是8方向的判断和资源文件精灵的刷新. 学到的知识点: 1,Enum.GetHashCode() 可以得到这个枚举的索引 ...
- C++ -> 在使用动态链表和异质链表产生野指针的步骤
C++ -> 在使用动态链表和异质链表产生野指针的步骤 使用异质链表产生野指针的情况,下面是修改书本的例子: ------------------------------------------ ...
- Windows新建域时 administrator账户密码不符合要求解决办法~!
解决方法 在cmd 命令行中 输入 net user administrator /passwordreq:yes
- 南昌邀请赛B题(拉格朗日插值)
题目链接:https://nanti.jisuanke.com/t/40254 #include<iostream> #include<cstdio> #include< ...
- AcWing 1057. 股票买卖 IV
//f[i,j,1]表示走到第i天已经进行完j次交易并且手中没有股票的所有的购买方式的集合 //f[i,j,0]表示走到第i天并且正在进行第j次交易且手中有货的所有的购买方式的集合 //属性利益最大值 ...
- 《NVM-Express-1_4-2019.06.10-Ratified》学习笔记(5.21.1.10-加-6.4)Atomic_Operations
5.21.1.10 Write Atomicity Normal 这个特性控制AWUN和NAWUN参数的操作.设置的属性值在set Feature命令的Dword 11中表明. 如果提交Get Fea ...
- c#后端 小程序上传图片
c#后端: /// <summary> /// 上传图片 /// </summary> /// <returns></returns> [HttpPos ...
- 多个iframe,删除详情页时刷新同级iframe的table list
说明:在使用iframe开发时,经常遇到多个iframe之间的操作. 下面就是一个需求:在一个iframe中关闭时,刷新指定的iframe: 添加需要刷新的标识reload=true //添加npi2 ...