当前位置: 首页 > news >正文

动态规划(二)——例题

目录

Help Jimmy

题目

解题思路

神奇的口袋

题目

枚举的解法

递归的解法

动态规划的解法

滑雪

题目

解题思路

解法一

解法二


Help Jimmy

题目

        "Help Jimmy" 是在下图所示的场景上完成的游戏:

        场景中包括多个长度和高度各不相同的平台。地面是最低的平台,高度为零,长度无限。
        Jimmy老鼠在时刻0从高于所有平台的某处开始下落,它的下落速度始终为1米/秒。当Jimmy落到某个平台上时,游戏者选择让它向左还是向右跑,它跑动的速度也是1米/秒。当Jimmy跑到平台的边缘时,开始继续下落。Jimmy每次下落的高度不能超过MAX米,不然就会摔死,游戏也会结束。
        设计一个程序,计算Jimmy到底地面时可能的最早时间。

输入

        第一行是测试数据的组数t(0 <= t <= 20)。每组测试数据的第一行是四个整数N,X,Y,MAX,用空格分隔。N是平台的数目(不包括地面),X和Y是Jimmy开始下落的位置的横竖坐标,MAX是一次下落的最大高度。接下来的N行每行描述一个平台,包括三个整数,X1[i],X2[i]和H[i]。H[i]表示平台的高度,X1[i]和X2[i]表示平台左右端点的横坐标。1 <= N <= 1000,-20000 <= X, X1[i], X2[i] <= 20000,0 < H[i] < Y <= 20000(i = 1..N)。所有坐标的单位都是米。
        Jimmy的大小和平台的厚度均忽略不计。如果Jimmy恰好落在某个平台的边缘,被视为落在平台上。所有的平台均不重叠或相连。测试数据保证问题一定有解。

1
3 8 17 20
0 10 8
0 10 13
4 14 3

输出

        对输入的每组测试数据,输出一个整数,Jimmy到底地面时可能的最早时间。

23
解题思路

        Jimmv跳到一块板上后,可以有两种选择,向左走,或向右走。
        走到左端和走到右端所需的时间,是很容易算的。
        如果我们能知道,以左端为起点到达地面的最短时间,和以右端为起点到达地面的最短时间,那么向左走还是向右走,就很容选择了。
        因此,整个问题就被分解成两个子问题,即Jimmv所在位置下方第一块板左端为起点到地面的最短时间,和右端为起点到地面的最短时间。
        这两个子问题在形式上和原问题是完全一致的。将板子从上到下从1开始进行无重复的编号(越高的板子编号越小,高度相同的几块板子,哪块编号在前无所谓),那么,和上面两个子问题相关的变量就只有板子的编号。

        不妨认为Jimmy开始的位置是一个编号为0,长度为0的板子假设LeftMinTime(k)表示从k号板子左端到地面的最短时间,RightMinTime(k)表示从k号板子右端到地面的最短时间,那么,求板子k左端点到地面的最短时间的方法如下:

if(板子k左端正下方没有别的板子){if( 板子k的高度 h(k) 大于Max)LeftMinTime(k) =00;elseLeftMinTime(k) h(k);
}
else if( 板子k左端正下方的板子编号是m){LeftMinTime(k) = h(k)-h(m) +Min( LeftMinTime(m) + Lx(k)-Lx(m) RightMinTime(m)+ Rx(m)-Lx(k));
}

        上面,h(i)就代表i号板子的高度,Lx(i)就代表i号板子左端点的横坐标,Rx(i)就代表i号板子右端点的横坐标。那么 h(k)-h(m)当然就是从k号板子跳到m号板子所需要的时间,Lx(k)-Lx(m) 就是从m号板子的落脚点走到m号板子左端点的时间,Rx(m)-Lx(k)就是从m号板子的落脚点走到右端点所需的时间。
        求RightMinTime(k)的过程类似。
        不妨认为Jimmy开始的位置是一个编号为0,长度为0的板子,那么整个问题就是要求LeftMinTime(0)。
        输入数据中,板子并没有按高度排序,所以程序中一定要首先将板子排序。
        时间复杂度:
        一共 n个板子,每个左右两端的最小时间各算一次O(n)
        找出板子一段到地面之间有那块板子,需要遍历板子 O(n)
        总的时间复杂度O(n2) 

神奇的口袋

题目

        有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是40。John现在有n个想要得到的物品,每个物品的体积分别是a1,a2……an。John可以从这些物品中选择一些,如果选出的物体的总体积是40,那么利用这个神奇的口袋,John就可以得到这些物品。现在的问题是,John有多少种不同的选择物品的方式。

输入

        输入的第一行是正整数n (1 <= n <= 20),表示不同的物品的数目。接下来的n行,每行有一个1到40之间的正整数,分别给出a1,a2……an的值。

3
20
20
20

输出

        输出不同的选择物品的方式的数目。

3
枚举的解法

        枚举每个物品是选还是不选,一共2的20次方种情况。

递归的解法
#include <iostream>
using namespace std;
int a[30]; int N;
int Ways(int w ,int k){//从前k种物品中选择一些,凑成体积w的做法数目if(w==0) return 1;if(k<=0) return 0;elsereturn Ways(wk-1)+Ways(w-a[k],k -1 );
}int main(){cin >> N;for(int i=1;i<=N;++i)cin >> a[i];cout << Ways(40,N);return 0;
}
动态规划的解法
#include <iostream>
using namespace std;
int a[30];  int N;
int Ways[50][50]://Ways[i][j]表示从前i种物品里凑出体积i的方法数
int main(){cin >> N;memset(Ways,0,sizeof(Ways));for( int i = 1;i <= N;++ i){cin >> a[i];I Ways[0][i]=1;}Ways[0][0] = 1;for(int w=1;w<=40; ++ W){for(int k =1;K <=N;++K){Ways[w][k]=Ways[w][k-1];if( w-a[k] >=0)Ways[w][k]+= Ways[w-a[k]][k-1];}}cout << Ways [40] [N] ;return 0;
}

滑雪

题目

        Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael想知道载一个区域中最长的滑坡。区域由一个二维数组给出。数组的每个数字代表点的高度。下面是一个例子

1  2  3  4  5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9

        一个人可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减小。在上面的例子中,一条可滑行的滑坡为24-17-16-1。当然25-24-23-...-3-2-1更长。事实上,这是最长的一条。

输入

        输入的第一行表示区域的行数R和列数C(1 <= R,C <= 100)。下面是R行,每行有C个整数,代表高度h,0<=h<=10000。

5 5
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9

输出 

        输出最长区域的长度。 

25
解题思路

L(ij)表示从点(ii)出发的最长滑行长度。
一个点(ii),如果周围没有比它低的点,L(ij)=1
否则
递推公式:L(ij)等于(i.i)周围四个点中,比(ij)低,且L值最大的那个点的L值,再加1
复杂度:O(n2)

解法一

“人人为我”式递推
L(i.j)表示从点(i.j)出发的最长滑行长度。
一个点(i.j).如果周围没有比它低的点,L(i.j)=1
将所有点按高度从小到大排序。每个点的L值都初始化为1从小到大遍历所有的点。经过一个点(i.j)时,用递推公式求L(i.j)

解法二

“我为人人”式递推
L(i,j)表示从点(i,j)出发的最长滑行长度。
一个点(i.j),如果周围没有比它低的点,L(i,j)=1
将所有点按高度从小到大排序。每个点的L值都初始化为1
从小到大遍历所有的点。经过一个点(ii)时,要更新他周围的,比它高的点的L值。例如:
if H(i+1,j)>H(ij) //H代表高度
    L(i+1,j)=max(L(i+1,j),L(i,j)+1)

http://www.lryc.cn/news/423920.html

相关文章:

  • Node.js中判断是文件还是文件夹的多种方法
  • idea 如何打war包
  • 米联客-FPGA程序设计Verilog语法入门篇连载-15 Verilog语法_跨时钟域设计
  • gradio 对话界面实现支持图片、视频正常显示
  • 催收业务怎么提高接通率
  • 动态生成sitemaps和robots.txt文件:提升SEO与网站可爬性
  • LeetCode 第二十五天 2024.8.12
  • Elasticsearch 全文查询详解
  • 20240810在荣品RK3588S-AHD开发板的预置Android13下挂载exFAT的256GB的TF卡
  • java基础进阶——log日志、类加载器、XML、单元测试、注解、枚举类
  • 《向量数据库指南》——控制Chatbot对话内容:Dopple AI的创新实践与用户体验优化
  • 构建实时数据仓库:流式处理与实时计算技术解析
  • python算术表达式遗传算法
  • net.sf.jsqlparser.statement.select.SelectItem
  • lua匹配MAC地址 正则表达式
  • Chainlit快速实现AI对话应用并将聊天数据的AWS S3 和 Azure Blob云服务中
  • 浅谈性能优化(基于C++)
  • Python 报错:ModuleNotFoundError: No module named ‘Crypto‘
  • UE(User Equipment) 和 UA(User Agent)
  • 视觉SLAM ch3补充——在Linux中配置VScode以及CMakeLists如何添加Eigen库
  • 开关电源:优化电子产品中的能源使用
  • Java语言程序设计——篇十三(2)
  • python结合csv和正则实现条件筛选数据统计分数
  • Ubuntu系统的基础操作和使用|Linux|安装|网络连接|更新与升级系统|系统维护|故障排除|监控|桌面环境|虚拟机|快捷键
  • day 38
  • 352532
  • Day.38 | 1143.最长公共子序列 1035.不相交的线 53.最大子序和 392.判断子序列
  • pytorch 3 计算图
  • 一文吃透:暗水印是什么?企业防泄密可以加暗水印吗?
  • Ajax-02.Axios