ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

1008 [NOIP2002]过河卒 线性DP 动态规划

2022-07-05 18:35:03  阅读:170  来源: 互联网

标签:cout NOIP2002 int ++ yy vis mp 1008 DP


链接:https://ac.nowcoder.com/acm/contest/24213/1008
来源:牛客网

题目描述

如图,A 点有一个过河卒,需要走到目标 B 点。卒行走规则:可以向下、或者向右。同时在棋盘上的任一点有一个对方的马(如上图的C点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点。例如上图 C 点上的马可以控制 9 个点(图中的P1,P2 … P8 和 C)。卒不能通过对方马的控制点。 棋盘用坐标表示,A 点(0,0)、B 点(n,m)(n,m 为不超过 20 的整数,并由键盘输入),同样马的位置坐标是需要给出的(约定: C<>A,同时C<>B)。现在要求你计算出卒从 A 点能够到达 B 点的路径的条数。

输入描述:

输入B点的坐标(n,m)以及对方马的坐标(X,Y){不用判错}

输出描述:

输出一个整数(路径的条数)。
示例1

输入

复制
6 6 3 2

输出

复制
17

 

分析

首先我们来看看下面这个图,这个图基本表现了题目的意思:一个卒要从图的左上角A点走到右下角B点,而其中有一点C为马的位置,C与其周边马能走到的P1~P8点共9个点是不能走的,问有多少种从A走到B的方法 我们可以先把这个问题当数学问题来考虑相信许多朋友以前都遇到过类似的数学问题,对于点[i,j],它的走法数等于它上方点与其左方点走法数之和(因为只能向下或向右走),也就是B[i,j]=B[i-1][j]+b[i][j-1],B[i,j]=B[i−1][j]+b[i][j−1],如下图就是一个例子
但换到有马阻拦的问题中,单纯地这样搜索就行不通了,如下图 这张图所得的答案虽然是正确的,但实际上这样的操作是错误的,图中蓝色的“1”应该改为0,如下图 因为这个位置后面被马头挡住,自然是行不通的,值应为0,在这个例子中这里的值是1还是0对答案没有影响,但大家可以想象,如果在最左边一条边上,一个点上下都是马能走到的位置,值还为1的话,就会影响它右侧点的值(不懂的看下面这个例子) 就像上图,正常情况下红色点所在的一整列初始赋值都是1,但是红色点实际值应该为0,如果值仍赋为1,则会导致蓝色点的值比实际值大1,从而导致整个结果错误。 
因此,我们在赋初值时,要专门考虑最上和最左一列的情况,具体方法参见代码

哦,对了,这道题的数据可能很大,注意要开long long,否则会炸  

易错点

1.数据太大,开LL

2.数组越界。

 

//-------------------------代码----------------------------

#define int LL
const int N = 70;
int n,m;
int vis[N][N];
int mp[N][N];

void solve()
{
cin>>n>>m;
// n ++ ,m ++ ;
memset(vis,0,sizeof vis);memset(mp,0,sizeof mp);
mp[0][0] = 1;
int x,y;cin>>x>>y;
// x ++ ,y ++ ;
vis[x][y] = 1;
for(int i = 0;i<8;i++) {
int xx = x + dx[i],yy = y + dy[i];
if(xx < 0 || yy < 0 ) continue;
vis[xx][yy] = 1;
}
for(int i = 0;i<=n;i++) {
for(int j = 0;j<=m;j++) {
if(vis[i][j]) {
mp[i][j] = 0;
} else {
if(i - 1 >= 0) {
mp[i][j] += mp[i-1][j];
}
if(j - 1 >= 0) {
mp[i][j] += mp[i][j-1];
}
if(vis[i][j] == 1) mp[i][j] = 0;
}
}
}
// fo(i,0,n) {
// fo(j,0,m) {
// cout<<mp[i][j]<<' ';
// }cout<<endl;
// }

cout<<mp[n][m]<<endl;
}

signed main(){
clapping();TLE;

// int t;cin>>t;while(t -- )
solve();
// {solve(); }
return 0;
}

/*样例区


*/

//------------------------------------------------------------

标签:cout,NOIP2002,int,++,yy,vis,mp,1008,DP
来源: https://www.cnblogs.com/er007/p/16448001.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有