首页 > 其他分享 >P1002题解

P1002题解

时间:2023-11-24 22:57:06浏览次数:40  
标签:25 int 题解 P1002 马能 转移 dp

思路

设 \(dp_{i,j}\) 表示第 \(i\) 行 \(j\) 列卒走到这里有多少种方式。

卒是可以向右和下走,所以到这个点只能从左或上来,不难得出转移公式:\(dp_{i,j} = dp_{i-1,j}+dp_{i,j-1}\)。

如果马在这个点上或者说马能到这个点上,那么卒不能到这个点,也就是卒到这个点的方式为 \(0\)。

如何判断马能不能到这个点呢?我们需要一个方向数组,马能走八个方向,依次枚举这八个点是不是当前点即可。

以上就是全部思路,但是还要注意一下几点:

  • \(dp_{0,0}\) 赋值为 \(1\),初始化。
  • 在转移过程中会数组越界,所以需要判断。
  • 转移时如果当前点是 \((0,0)\) 则不进行转移,因为这是初始点,已经有值了。

AC CODE

#include <bits/stdc++.h>
using namespace std;
#define int long long
int dp[25][25];
int dx[8]={-1,-2,-2,-1,1,2,2,1},dy[8]={-2,-1,1,2,2,1,-1,-2};
signed main(){
	int n,m,x,y;
	cin>>n>>m>>x>>y;
	dp[0][0]=1;//初始值
	bool ok=1;
	for(int i=0;i<=n;i++){
		for(int j=0;j<=m;j++){
			if(i==0&&j==0)continue;//不能是初始点
			ok=1;
			if(i==x&&j==y)ok=0;//这个点是不是马的位置
			for(int k=0;k<8;k++){//这个点有没有被马控制
				if(i==x+dx[k]&&j==y+dy[k]){ok=0;break;}
			}
			if(ok){//转移
				if(i-1<0){//判断越界
					dp[i][j]=dp[i][j-1];
				}
				else if(j-1<0){
					dp[i][j]=dp[i-1][j];
				}
				else{
					dp[i][j]=dp[i-1][j]+dp[i][j-1];	
				}
				
			}
		} 
	}
	cout<<dp[n][m]<<endl;
	return 0;
}

标签:25,int,题解,P1002,马能,转移,dp
From: https://www.cnblogs.com/xdh2012/p/17854962.html

相关文章

  • P1135题解
    思路我写的好像是动规的做法。设\(f_{i,j}\)表示第\(i\)步\(j\)个点是否可以走到,值要么为\(1\),要么为\(0\)。最多走\(n\)步,因为总共只有\(n\)个点,每一步都肯定会多延伸出一个点,要不然就重复计算。不难得出转移公式:\(f_{i+1,j+k_j}=f_{i,j}\)\(f_{i+1,j-k_j}=f_{......
  • P1003题解
    简单模拟题。思路枚举每一个地毯,因为后面的会覆盖前面的,所以从正序枚举。如果要求的点的坐标在当前地毯上,则将答案赋值为当前地毯编号。最后输出答案。那如果这个点没有地毯呢?答案初始设为\(-1\),这样没有地毯覆盖的话,答案不会改变,这样输出答案就会是\(-1\)。注意:记得赋初......
  • SP9199题解
    考察了小学奥数知识,不会的请先去学习一下相遇与追及。思路两个人相遇的点一定是有周期性的,我们可以先算出一个周期会走多远,而这个距离是两人速度的最小公倍数。接着需分情况讨论。如果两人是同向,则为追及,需用距离除以一人的速度减去距离除以另一人的速度。需要取绝对值。......
  • P5163 WD与地图 题解
    来一发分治题解吧。感觉和单纯的整体二分还是有一点区别。虽然整体二分也能看作分治就是了。思路首先时光倒流。删边改为加边。这没有什么好说的,比较基础。我们考虑在不断加边时,每两个点是在什么时候变成一个强连通分量里面的。考虑分治。首先在\([l,r]\)内选取中点\(......
  • P1002 [NOIP2002 普及组] 过河卒
    [NOIP2002普及组]过河卒题目描述棋盘上\(A\)点有一个过河卒,需要走到目标\(B\)点。卒行走的规则:可以向下、或者向右。同时在棋盘上\(C\)点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”。棋盘用坐标表示,\(A\)点\((0......
  • [ABC327D] Good Tuple Problem 题解
    分析:这一道题很容易发现可以用并查集来维护(不知道为什么其他人都用了图论),\(a_i\)与其对应的\(b_i\)代表着\(a_i\)这个集合里不能存在着\(b_i\)。根据只有存在两个集合,所以我们会发现,若\(x\)与\(y\)不在一个集合且\(x\)与\(z\)也不在一个集合,那么\(x\)和\(y\)......
  • [ABC328C] Consecutive 题解
    给一个长度为\(n\)的字符串\(s\),\(q\)次询问,每一次\(l\)和\(r\)区间内有多少个\(s_i\)等于\(s_{i-1}\)。\(10^5\)的数据\(O(N^2)\)暴力肯定行不通。于是我们考虑预处理前缀和,处理到\(i\)下标以及之前有多少个\(s_i\)等于\(s_{i-1}\)。每一次查询\(O(1)\)回......
  • [ABC328D] Take ABC 题解
    题目大意:给你一个字符串\(s\)。你要在其中找到多少个ABC的子串,例如AABCBC算两个,删掉中间的ABC后,前面的和后面的加起来也是一个ABC,所以就算两个。思路分析:首先很容易写出暴力,把一个ABC提取出来后把后面的元素往前移,然后再重复操作,但是我们发现时间复杂度会卡成\(O(n^......
  • [ABC329C] Count xxx 题解
    插曲因为本人看错了题面,买看到一个子串只包含一种字母,所以切完D和E才回来发现很简单。问题翻译给你一个长度为\(N\)的字符串\(S\),由小写英文字母组成。求\(S\)的非空子串中有多少个是一个字符的重复。在这里,作为字符串的两个子串是相等的,即使它们是以不同的方式得到......
  • [ABC329D] Election Quick Report 题解
    题目翻译有一场选举,要从\(N\)名候选人中选出一名获胜者,候选人编号为\(1,2,\ldots,N\),共有\(M\)张选票。每张选票正好投给一位候选人,其中\(i\)票投给了候选人\(A_i\)。选票将按照从第一张到最后一张的顺序进行统计,每张选票统计完毕后,将更新并显示当前的获胜者。得票......