首页 资讯 财经 科技 汽车 房产 教育 关注 图片 数码 导购 手机版

【题解】洛谷 P1002 [NOIP2002 普及组] 过河卒

来源:博客园 发布时间:2023-08-25 05:15:39


(资料图片仅供参考)

原题链接

解题思路

这是一道经典的动态规划题目。

如果尝试使用深度优先搜索(dfs)或广度优先搜索(bfs)做就会获得 TLE (注意数据范围)。于是我们想到了更为高级的动态规划(Dynamic Programming, dp)。

简略介绍动态规划算法的核心思想:把原问题分解为相对简单的子问题的方式求解复杂问题。与递推有几分相似?递推其实是动态规划的一个分支!

在求解动态规划这一类问题时,一般有三步:

1.状态的表示

在这道题目中,可以使用一个二维数组 dp[n][m] 来存放每一个子问题的答案,即用 dp[i][j] 来表示到达第i行第j列所需的最多步数,dp[n][m] 也就是答案了。

2.设立边界条件

由于过河卒初始就在第0列第0行,所以 dp[0][0] = 1;而他只能向下走或向右走,当在第0行或第0列时,情况只有1种。

3.状态转移方程

动态规划一类题目中的最关键部分。过河卒只能向下走或向右走,故 dp[i][j] = dp[i-1][j] + dp[i][j-1]。

注意:还要注意马可以到达的地方,过河卒不能到达。

代码实现

1 #include 2 using namespace std; 3 const int N = 25; 4 const int dir[][2] = { 5     {1, 2}, {1, -2}, {2, 1}, {2, -1}, 6     {-1, 2}, {-1, -2}, {-2, 1}, {-2, -1} 7 }; 8 long long dp[N][N]; 9 int n, m, sx, sy;10 bool vis[N][N];11 int main() {12     cin >> n >> m >> sx >> sy;13     vis[sx][sy] = true;14     for (int i = 0; i < 8; i ++){15         int tx = sx + dir[i][0];16         int ty = sy + dir[i][1];17         if (tx >= 0 && tx <= n && ty >= 0 && ty <= m)18             vis[tx][ty] = true;19     }20     dp[0][0] = 1;21     for (int i = 0; i <= n; i ++)22         for (int j = 0; j <= m; j ++)23             if (!vis[i][j]){24                 if (i) dp[i][j] += dp[i - 1][j];25                 if (j) dp[i][j] += dp[i][j - 1];26             }27     cout << dp[n][m];28     return 0;29 }

关键词:

责任编辑:FG003

2元女装批发

网站首页| 关于我们 | 联系我们| 合作伙伴 | 广告投放 | 招贤纳士| 增值服务| 使用条款 | 用户反馈

服务电话:180151838 QQ客服: 点击这里给我发送QQ消息  E-mail: 3 392 950@qq.com

声明: 迅捷汽车网部分文章来自互联网,如侵犯了您的版权请告之,我站将第一时间内删除 !
未经迅捷汽车网许可,禁止建立迅捷汽车网镜像,禁止抄袭迅捷汽车网数据。欢迎许可转载,注明出处!
Copyright©2010 - 2018 auto.xjche365.com All rights reserved 迅捷汽车网 版权所有 浙ICP备2022016517号-9
版权所有 抄袭必究