J - The King‘s Walk
思路:dx = abs(x1 - x2), dy = abs(y1 - y2), 那么最短距离一定是,然后就是状态表示了,表示当前点向上走i步且最终在第j列的方案数,我们知道我们每一步都要缩短短距离,也就是向上走,那么我们转移方程也就有了
f(i, j) =f(i - 1, j) +f(i - 1, j - 1) +f(i - 1, j + 1) 转移过来。
然后滚动一维即可
int n;
int f[2][M]; // 向上走x步,且走到第j的方案书
int sx, sy, ex, ey;
void solve()
{
cin >> n;
cin >> sx >> sy >> ex >> ey;
int dx = abs(sx - ex);
int dy = abs(sy - ey);
int cnt, x, y;
if (dx > dy)
{
cnt = dx;
x = sy;
y = ey;
}
else
{
cnt = dy;
x = sx;
y = ex;
}
memset(f, 0, sizeof f);
f[0][x] = 1;
for (int i = 1; i <= cnt; i++)
{
for (int j = 1; j <= n; j++)
{
f[i & 1][j] = (f[i - 1 & 1][j - 1] + f[i - 1 & 1][j + 1] + f[i - 1 & 1][j]) % mod;
}
}
cout << f[cnt & 1][y] << endl;
}