动态规划:洛谷P1002 [NOIP2002 普及组] 过河卒
洛谷P1002 [NOIP2002 普及组] 过河卒
其实看到这种二维图,像走迷宫,我就想到了广度优先搜索,BFS。但是我发现了卒只能向下走和向右走,我就想到了动态规划。状态转移方程是:dp[i][j]=dp[i-1][j]+dp[i][j-1],然后因为在边缘的一圈的边界条件都无法用这个方程,所以我们干脆让每个坐标都++,不管边界条件,把起点和终点加加,注意把数组初始化在main外,这样可以初始化为0.
上代码:
1 #include<iostream> 2 using namespace std; 3 bool vis[25][25]; 4 long long dp[25][25];//就是 dp 数组 5 int main() 6 { 7 dp[1][1] = 1; 8 int n, m, x, y; 9 cin >> n >> m >> x >> y; 10 n++;//把每个参数都加1 这样就不用考虑边界条件 11 m++; 12 x++; 13 y++; 14 vis[x][y] = 1; 15 vis[x - 2][y - 1] = 1; 16 vis[x - 2][y + 1] = 1; 17 vis[x + 2][y - 1] = 1; 18 vis[x + 2][y + 1] = 1; 19 vis[x - 1][y + 2] = 1; 20 vis[x - 1][y - 2] = 1; 21 vis[x + 1][y + 2] = 1; 22 vis[x + 1][y - 2] = 1;//标记一下马的控制点 23 for (int i = 1; i <= n; i++) 24 for (int j = 1; j <= m; j++) 25 { 26 if ((i != 1 || j != 1)/*就是不考虑1, 1这个点*/ && !vis[i][j]) 27 { 28 dp[i][j] = dp[i - 1][j] + dp[i][j - 1]; 29 } 30 } 31 32 printf("%lld", dp[n][m]); 33 }
AC图:
结束啦,有空我再用BFS做一下。