第七题:走方格
题目描述
在平面上有一些二维的点阵。
这些点的编号就像二维数组的编号一样,从上到下依次为第1至第n行, 从左到右依次为第1至第m列,每一个点可以用行号和列号来表示。 现在有个人站在第1行第1列,要走到第n行第m列。只能向右或者向下走。
注意,如果行号和列数都是偶数,不能走入这一格中。
问有多少种方案?n,m不超过30
#include <bits/stdc++.h>
using namespace std;
int main(){
int n,m;//输入的n与m
int dp[31]][31];//题目说测试的n与m不超过30
cin>>n>>m;
memset(dp,0,sizeof(dp));//初始化整个数组
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(i%2==0&&j%2==0)
dp[i][j]=0;
else
{
dp[i][j]=dp[i-1][j]+dp[i][j-1];//状态方程
dp[1][1]=1;
}
cout<<dp[n][m];
}
思路:没啥好讲的,动态规划就行。
每次的dp[i][j]=dp[i-1][j]+dp[i][j-1],边界是dp[1][1]=1;
当然当为偶数格就是x与y都为偶数的时候,次数为0。
然后每次元操作有个dp[1][1]=1,是为了保证边界为1,其余偶数边界为0。