动态规划的引入 P1002 过河卒【动态规划】
题目
https://www.luogu.com.cn/problem/P1002
题目分析
卒可以向右、向下走,所以使用dp数组,如果自己的左边是通的(不是被马控制的节点)就把自己的dp加上自己左边的dp(上边同理),一直到最后最右下方的节点,该点的dp值就是答案
至于马的控制点:另外开一个数组,标记马的控制节点(这里注意在类似迷宫的题目中就早点方向的移动使用数组的方式来实现是比较方便的)
代码
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; long long dp[50][50]; int tmp[50][50]; int tmpx[8] = { 1,-1,2,2,-2,-2,-1,1 }; int tmpy[8] = { 2,2,1,-1,1,-1,-2, -2 }; int x, y, x2, y2; int main() { scanf("%d%d%d%d", &x, &y, &x2, &y2); tmp[x2][y2] = 1; for (int i = 0; i < 8; i++) { int xx = tmpx[i] + x2; int yy = tmpy[i] + y2; if (xx >= 0 && xx <= x&&yy >= 0 && yy <= y) tmp[xx][yy] = 1; } for (int i = 0; i <= x; i++) { dp[i][0] = 1 ^ tmp[i][0]; if (dp[i][0] == 0)break; } for (int i = 0; i <= y; i++) { dp[0][i] = 1 ^ tmp[0][i]; if (dp[0][i] == 0)break; } for (int i = 1; i <= x; i++) { for (int j = 1; j <= y; j++) { dp[i][j] = (dp[i - 1][j] + dp[i][j - 1])*(1 ^ tmp[i][j]); } } printf("%lld", dp[x][y]); }