c++踩方格-动态规划基础题

news/2024/9/25 23:24:00

有一个方格矩阵,矩阵边界在无穷远处。我们做如下假设:
a、每走一步时,只能从当前方格移动一格,走到某个相邻的方格上;
b、走过的格子立即塌陷无法再走第二次;
c、只能向北、东、西三个方向走;
请问:如果允许在方格矩阵上走n步,共有多少种不同的方案。2种走法只要有一步不一样,即被认为是不同的方案。
输入格式
允许在方格上行走的步数n(n≤20)。
输出格式
计算出的方案数量。
样例:1->3;2->7;3->17。

这道题在最初找第三步的时候,只找到15条,一直很懵逼,怎么网上答案都是17条。后来才发现是我漏了,漏的是和2->3和0->1的路线中3和1重叠,将那个3砍掉了。

这是第二步的路线图,圆形是起点,四边形是第一步的落点,五边形是第二步的落点。
实际上到了第二步,大概的一个关系能够确定,

这是第三步的路线图,三角形是第三步的落点,主要是红色标识的地方,这两个三角形,由于路线不同,不会出现坍塌,要计入的。
接下来就是分析关系了。
初始状态F[0]=1,
走了一步后F[1]=3,
走了两步后F[2]=7,
走了三步后F[3]=17。

走第二步的时候,能够发现所有菱形都至少产生了两个方向的五边形,其中一个菱形产生了三个方向的五边形。F[2]=32+1
走第三步的时候,能够发现所有菱形都至少产生了两个方向的三角形,而有三处菱形产生了三个方向的五边形。F[3]=7
2+3
根据画图,能够发现,上一步的基础上,向上和向左(或者向右)都是存在的,有2F[i-1]。那么多出来的向左(或者向右)是由哪部分产生?
是上上一步的向上箭头产生的图形,才拥有多朝左(或者右)的分支。
比如红圈圈出来的五边形以及顶部的五边形,都是菱形向上箭头产生出来的,而他们都拥有三个分支。往前看,第二步中菱形有三个分支的那处,也是向上箭头产生的。如果对于数据还是不够确定规律,可以继续画第四步,进行验证。

#include<bits/stdc++.h>
using namespace std;
int main(){int f[21]={1, 3, 7, 17}, n;cin >> n;for(int i=3;i<=n;i++){f[i]=2*f[i-1]+f[i-2];}cout << f[n] << endl;return 0;
}

递归写法

#include<bits/stdc++.h>
using namespace std;int dfs(int n){if(n<1) return 1;if(n==1) return 3;if(n==2) return 7;return 2*dfs(n-1)+dfs(n-2);
}int main(){int n;cin >> n;cout << dfs(n) << endl;return 0;
}

上面那种递归,dfs(2)至少会进入两次,所以可以记忆化搜索

#include <bits/stdc++.h>
using namespace std;int dp[21] = {1, 3, 7};int dfs(int n) {if (n < 1) return 1;if (n == 1) return 3;if (n == 2) return 7;if (dp[n - 1] == 0)  dp[n - 1] = dfs(n - 1);if (dp[n - 2] == 0)  dp[n - 2] = dfs(n - 2);return 2 * dp[n - 1] + dp[n - 2];
}int main() {int n;cin >> n;cout << dfs(n) << endl;return 0;
}

总的来说,肯定还是第一种使用数组存储更便捷。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/30659.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

Windows分区报错解决

本人神州笔记本,今天在更新时查看了分区,有很多小分区 想合并下,但是把一些系统分区也合并了,导致gg 在合并分区时启动出错,No boot Device 进入 bios里找不到硬盘 在用移动硬盘安装大白菜之类的东西,然后在用傲梅在 C盘分区哪里添EFI和MRB还是什么来着,或者在重装下系…

autoit au3 IT管理员使用指南(二)自动安装软件基础

简介 上篇介绍了au3的基本操作流程,对于我们要自动安装软件,那么就是要安装某个软件,执行一个程序。 本篇介绍执行一个程序。 Run 我们可以通过Run命令来执行一个程序,那么我们尝试执行一下搜狗输入法吧。 创建sougou_input目录,下载搜狗输入法安装文件放入该目录。 创建一…

宝塔docker快速安装Halo

宝塔docker快速安装Halo 一、Docker 部署Halo 我们前面还是需要先在宝塔面板环境中安装Docker,一般默认时候是没有安装的。这里我们在宝塔面板中的Docker管理器应用商店中安装。我们可以看到直接等待安装成功。后面在部署程序的时候有需要用到这里界面。二、这里我们在【镜像管…

Bean的作用域和自动装配

Spring Bean的作用域主要有五种Singleton是单例类型,就是在创建起容器时就同时自动创建了一个bean的对象,不管你是否使用,他都存在了,每次获取到的对象都是同一个对象。注意,singleton作用域是Spring中的缺省作用域(默认的作用域)。 prototype是原型类型,它在我们创建容…

跟着ChatGPT学算法-完全背包问题

一、题目 给定 n 个物品,第 i 个物品的重量为 wgt[i-1]、价值为 val[i-1] ,和一个容量为 cap 的背包。每个物品可以重复选取,问在限定背包容量下能放入物品的最大价值。二、和ChatGPT聊聊您 您是一位资深算法工程师,请深入浅出地给出完全背包问题的分析过程和完整带注释的J…

MySQL5.7安装详细过程--window系统

一:MySQL5.7安装详细过程--window系统1.1、下载MySQL5.7安装包https://downloads.mysql.com/archives/community/1.2、将文件解压到盘符中你可以解压到你想解压的位置,放在C或其他盘符都可以。1.3、配置MySQL的环境变量由于我们下载的不是exe或者msi版本,不能直接双击安装,…

一文学会 Kubernetes Pod 的生命周期管理(转载)

收获 了解 Pod 的状态(Status) 了解 pod 阶段(Phase) 了解 Pod conditions了解容器状态(Status) 保持容器健康了解容器自动重启使用探活(liveness)探针(Probe)检查容器的健康状况如果程序启动缓慢,请使用 startup probeLiveness probe 一些建议 在容器启动和关闭时执…