0
点赞
收藏
分享

微信扫一扫

洛谷 P1002 [NOIP2002 普及组] 过河卒(线性dp)

南陵王梁枫 2022-05-06 阅读 56

  

//状态表示  f[i][j]表示  走到(i,j)的集合;
//    属性:方案数;
//  计算  f[i-1][j]+f[i][j-1];

//坑点: 爆int ,而且范围还不会计算,一遍遍试,积累经验;
//       有 f[i-1][j],f[i][[j-1];  题目从(0,0)开始
//   会数组越界; 
//马本身也不能走; 
 
//巧妙:有马可到的地方   f[i][j]置为0;退出,不更新;  

#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;

const int N=1010;


int n,m,x2,y2;
long long f[N][N];
int dx[]={-2,-2,-1,-1,1,1,2,2};
int dy[]={-1,1,-2,2,-2,2,-1,1};
bool st[N][N];

int main()
{	

	 
	cin>>n>>m>>x2>>y2;
	for(int i=0;i<8;i++)
	{
		int a=dx[i]+x2+1;
		int b=dy[i]+y2+1;
		if(a>0&&b>0)
		st[a][b]=true;
	}
	st[x2+1][y2+1]=true;
     f[1][0]=1;
	 for(int i=1;i<=n+1;i++)
	 	for(int j=1;j<=m+1;j++)
	 	{
	 		if(st[i][j])
			 {
			 	f[i][j]=0;
			 	continue; 
			 }
			 
	 		f[i][j]=f[i-1][j]+f[i][j-1];
		 }
		 cout<<f[n+1][m+1]<<endl;
	return 0;
}
举报

相关推荐

0 条评论