博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【题解】洛谷P1002过河卒
阅读量:4949 次
发布时间:2019-06-11

本文共 1166 字,大约阅读时间需要 3 分钟。

首先,一道入门DP

然而对于蒟蒻的我已经难到爆了好吗


第一点:动态转移方程

用DP的关键

这题我们可以发现每一步的方案数由上面的那步加上左边的那步得到

所以自然而然的方程就出来了:

f[i][k]=f[i-1][k]+f[i][k-1]


第二点:DP边界

在所有的方案数计算内我们可以快速准确地发现:f[0][0]=1

走到起点的方案数为一种


注意事项

本题有个较为坑爹的地方:

马可以在起点

所以需要特判,在代码环节会提到


那么代码就来了

#include
using namespace std; long long f[25][25];//不用高精,但要long long int dx[8]={1,1,-1,-1,2,2,-2,-2}, dy[8]={2,-2,2,-2,1,-1,1,-1};//马可以走到的地方 int n,m,x,y; int main() { cin>>n>>m>>x>>y; f[x][y]=-1;//定义马的那格不能走 for(int i=0;i<8;i++) { int xx=x+dx[i]; int yy=y+dy[i]; if(xx>=0&&xx<=n&&yy>=0&&yy<=m) f[xx][yy]=-1; }//定义马可以走到的格子不能走 if(f[0][0]!=-1)//判断起点有没有被马占领 { f[0][0]=1;//定义走到起点的方法有一种,DP的边界 for(int i=0;i<=n;i++) for(int j=0;j<=m;j++) if(f[i][j]!=-1)//如果当前的格子能走的话,计算从起点到这里的方法数 { if(i>=1&&f[i-1][j]!=-1)//i>=1是为了避免i=0的情况 f[i][j]+=f[i-1][j]; if(j>=1&&f[i][j-1]!=-1)//同理 f[i][j]+=f[i][j-1]; } cout<

大功告成!

蒟蒻的第一个题解庆祝!

转载于:https://www.cnblogs.com/BrokenString/p/9279549.html

你可能感兴趣的文章
Ext JS学习第十三天 Ext基础之 Ext.Element
查看>>
python--迭代器与生成器
查看>>
SQL之case when then用法详解
查看>>
STL 排序函数
查看>>
Microsoft Dynamics CRM 2011 面向Internet部署 (IFD) ADFS虚拟机环境搭建的步骤(CRM与ADFS装在同一台服务器上) 摘自网络...
查看>>
Setting up a Passive FTP Server in Windows Azure VM(ReplyCode: 227, Entering Passive Mode )
查看>>
Atitit mtp ptp rndis midi协议的不同区别
查看>>
Ajax辅助方法
查看>>
Python模块调用
查看>>
委托的调用
查看>>
c#中从string数组转换到int数组
查看>>
Scrapy入门程序点评
查看>>
DotNetty网络通信框架学习之源码分析
查看>>
8.1 Android Basic 数据存储 Preferences Structured(分组的Preferences)
查看>>
原因和证明
查看>>
VC6.0图像处理2--图像的反色
查看>>
Snoop, 对WPF程序有效的SPY++机制
查看>>
Does not contain a valid host;port authority解决方法
查看>>
JAVA程序猿怎么才干高速查找到学习资料?
查看>>
使用axel下载百度云文件
查看>>