题目描述
题目思路
起 | → | → | ||
↓ | 禁 | ↓ | 禁 | |
→ | → | → | 终 | |
禁 | 禁 | |||
方格图形式的题目坐标正好对应了二维数组,因此建立,代表从起点到达目标点的方案数。观察地图,发现有两种类型的可通过方格:单行道和十字路口。如果目标点位于单行道,那么只有前一个格子能够到达它;如果目标点位于十字路口,就可以从左边与上边两个格子到达,由此建立状态转移方程:
初始状态设置如下:
由于方程不存在均为偶数的情况,所以自动规避了无法通过的方格。
我的代码
#include <iostream>
#include <algorithm>
using namespace std;
const int max_n = 31;
int dp[max_n][max_n];
int main() {
int n;
int m;
cin >> n >> m;
//赋初值
int i;
int j;
for (i = 0; i <= n; i++)
{
for (j = 0; j <= m; j++)
{
if (i == 1) {
dp[i][j] = 1;
}
else if (j == 1) {
dp[i][j] = 1;
}
else {
dp[i][j] = 0;
}
}
}
//动态规划
for (i = 2; i <= n; i++)
{
for (j = 2; j <= m; j++)
{
if (i % 2 == 1 && j % 2 == 0) {
dp[i][j] = dp[i][j - 1];
}
else if (i % 2 == 0 && j % 2 == 1) {
dp[i][j] = dp[i - 1][j];
}
else if (i % 2 == 1 && j % 2 == 1) {
dp[i][j] = dp[i][j - 1] + dp[i - 1][j];
}
}
}
cout << dp[n][m];
return 0;
}