dp 入门题
题目大概要求
- 计算从起点 (0, 0) 到终点 (n, m) 的方案总数
- 每次只能向下货向右走一格
- 马本身的位置及其一次移动后的位置不可经过
这是一道很简单的 dp 题,第 (x, y) 点的方案总数为 (x - 1, y) 点与 (x, y - 1) 点的方案和,动态转移方程为:
f(x, y) = f(x - 1, y) + f(x, y - 1)
再额外对被马覆盖的点进行单独处理即可,代码如下:
#include <cstdio>
using namespace std;
int x_end, y_end, x_horse, y_horse;
long long g[25][25]; // 一个二维数组,储存到每个点的方案数,需要开 long long
bool vis[25][25]; // 表示每个点是否走过
int dx[8] = {0, -1, -2, -2, -1, 1, 2, 2, 1};
int dy[8] = {0, -2, -1, 1, 2, 2, 1, -1, -2};
// 方向数组,表示马走一步的偏移量
int main() {
scanf("%d%d%d%d", &x_end, &y_end, &x_horse, &y_horse);
x_end += 2; y_end += 2; x_horse += 2; y_horse += 2; // 防止数组越界,因为马走一步行和列移动最远的距离为2,所以要加上2
for (int i = 0; i <= 8; i++)
vis[x_horse + dx[i]][y_horse + dy[i]] = 1;
// 对卒不能走到的点进行标记
g[2][1] = 1; // 对图进行初始化
for (int i = 2; i <= x_end; i++)
for (int j = 2; j <= y_end; j++)
if (vis[i][j] == 0)
g[i][j] = g[i - 1][j] + g[i][j - 1]; // 如果这个点可走,那么计算走到此点的总方案数
printf("%lld", g[x_end][y_end]);
return 0;
}
抱天下工作室招人
要求:
- 年龄不限
- 有担当
- 有自己擅长的编程语言
- 愿意接受不定薪资(¥RMB)
- 有奉献精神
- 服从集体
- 敢于发言
有意者加Q群:536950507