在平面上有一些二维的点阵。
这些点的编号就像二维数组的编号一样,从上到下依次为第 1 至第 n 行,从左到右依次为第 1 至第 m 列,每一个点可以用行号和列号来表示。
现在有个人站在第 1 行第 1 列,要走到第 n 行第 m 列。
只能向右或者向下走。
注意,如果行号和列数都是偶数,不能走入这一格中。
问有多少种方案。
输入格式 输入一行包含两个整数 n,m。
输出格式 输出一个整数,表示答案。
数据范围 1≤n,m≤30
输入样例1: 3 4
输出样例1: 2
输入样例2: 6 6
输出样例2: 0
解题思路:dp往右下递推,如果当前位置x、y有一个不是偶数,那么他就可以从上或者从左边转移过来,否则这个点到不了,为0
#include<bits/stdc++.h>
#define x first
#define y second
#define mem(h) memset(h,-1,sizeof h)
#define mcp(a,b) memcpy(a,b,sizeof b)
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
typedef pair<int,int>PII;
typedef pair<double,double>PDD;
namespace IO{
inline LL read(){
LL o=0,f=1;char c=getchar();
while(c<'0'||c>'9'){
if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){
o=o*10+c-'0';c=getchar();}
return o*f;
}
}using namespace IO;
//#############以上是自定义技巧(可忽略)##########
const int N=1e4+7,M=2e5+7,INF=0x3f3f3f3f,mod=1e8+7,P=131;
int n,m;
int dp[N][N];
int main(){
cin>>n>>m;
dp[1][1]=1;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(i==1&&j==1)continue;
if(i%2!=0||j%2!=0){
//如果有一个不为偶数
dp[i][j]+=dp[i-1][j];//可以从上面转移过来
dp[i][j]+=dp[i][j-1];//可以从左边转移过来
}else{
//否则就进不来,为0
dp[i][j]=0;
}
}
}
cout<<dp[n][m]<<endl;
return 0;
}