版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、ACM程序设计,福州大学至诚学院 冯新,2020/9/12,2,第九讲,动态规划初步,2020/9/12,3,一、经典问题:数塔问题,有形如下图所示的数塔,从顶部出发,在每一结点可以选择向左走或是向右走,一直走到底层,要求找出一条路径,使路径上的值最大。,2020/9/12,4,Input 输入数据首先包括一个整数C,表示测试实例的个数,每个测试实例的第一行是一个整数N(1 = N = 100),表示数塔的高度,接下来用N行数字表示数塔,其中第i行有个i个整数,且所有的整数均在区间0,99内 Output 对于每个测试实例,输出可能得到的最大和,每个实例的输出占一行。 Sample Input
2、 1 5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 Sample Output 30,2020/9/12,5,用暴力的方法,可以吗?,2020/9/12,6,这道题如果用枚举法(暴力思想),在数塔层数稍大的情况下(如31),则需要列举出的路径条数将是一个非常庞大的数目(230= 10243 109=10亿)。,试想一下:,2020/9/12,7,拒绝暴力,倡导和谐,2020/9/12,8,从顶点出发时到底向左走还是向右走应取决于是从左走能取到最大值还是从右走能取到最大值,只要左右两道路径上的最大值求出来了才能作出决策。 同样,下一层的走向又要取决于再下一层上的最大值是否已经求
3、出才能决策。这样一层一层推下去,直到倒数第二层时就非常明了。 如数字2,只要选择它下面较大值的结点19前进就可以了。所以实际求解时,可从底层开始,层层递进,最后得到最大值。 结论:自顶向下的分析,自底向上的计算。,考虑一下:,2020/9/12,9,有公式: MaxSumrj = arj r=N =Max(MaxSumr+1j,MaxSumr+1j+1)+arj r=其他,2020/9/12,10,int main() int a100100; int sum100100; int t,i,j; scanf(%d, ,#include int max(int a,int b) if(ab)re
4、turn a; else return b; ,2020/9/12,11,许多求最优解的问题可以用动态规划来解决。用动态规划解题首先要把原问题分解成若干个子问题,子问题的解一旦求出就被保存。 找到子问题,就意味着找到了将整个问题逐渐分解的办法,因为子问题可以用相同的思路分解成子问题,一直分解下去,直到最底层规模最小的问题一目了然看出解。每层问题的解决,会导致上层问题的解决,逐层向上,就会导致整个问题的解决,我们可采取自底层的子问题开始,自底向上的推导出一个个子问题的解。,2020/9/12,12,二、经典问题:最长有序子序列,2020/9/12,13,二、经典问题:最长有序子序列,问题描述 一
5、个数的序列bi,当b1 b2 . bS的时候,我们称这个序列是上升的。对于给定的一个序列(a1, a2, ., aN),我们可以得到一些上升的子序列(ai1, ai2, ., aiK),这里1 = i1 i2 . iK = N。比如,对于序列(1, 7, 3, 5, 9, 4, 8),有它的一些上升子序列,如(1, 7), (3, 4, 8)等等。这些子序列中最长的长度是4,比如子序列(1, 3, 5, 8). 你的任务,就是对于给定的序列,求出最长上升子序列的长度。,2020/9/12,14,二、经典问题:最长有序子序列,输入数据 输入的第一行是序列的长度N (1 = N = 1000)。第
6、二行给出序列中的N个整数,这些整数的取值范围都在0到10000。 输出要求 最长上升子序列的长度。 输入样例 7 1 7 3 5 9 4 8 输出样例 4,2020/9/12,15,二、经典问题:最长有序子序列,如何把这个问题分解成子问题呢?经过分析,发现 “求以ak(k=1, 2, 3N)为终点的最长上升子序列的长度”是个好的子问题这里把一个上升子序列中最右边的那个数,称为该子序列的“终点”。虽然这个子问题和原问题形式上并不完全一样,但是只要这N个子问题都解决了,那么这N个子问题的解中,最大的那个就是整个问题的解。 MaxLen (1) = 1 MaxLen (k) = Max MaxLen (i):1i k 且 ai ak且 k1 + 1 MaxLen(k)的值,就是在ak左边,“终点”数值小于ak,且长度最大的那个上升子序列的长度再加1。因为ak左边任何“终点”小于ak的子序列,加上ak后就能形成一个更长的上升子序列。,2020/9/12,16,解决方案:,2020/9/12,17,#include #define MAX_N 1000 int bMAX_N + 10; int aMaxLenMAX_N + 10; int main() int N,i,j,nMax, nTmp; scanf(%d,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 34980.1-2026智能终端软件平台技术要求第1部分:操作系统
- 企业固定资产采购管理模板统一规范操作
- 感染后关节炎的护理
- 互联网应用安全服务保障承诺书范文5篇
- 教育专项资金规范化管理承诺书4篇
- 维护数据安全不泄露承诺书5篇
- 技术项目实施计划与验收标准
- 工厂设备重大故障停机抢修预案
- 项目透明执行承诺书7篇
- 2026年智能音箱市场需求分析报告
- 内衣店新员工入职培训
- 电网检修培训课件下载
- 电器元件销售管理制度
- 三种方法评标计算(自带公式)
- 研究生导师培训讲座
- 《西藏自治区地质灾害危险性评估报告编制及审查技术要求(试行)》
- 3.2 工业的区位选择 课件 2024-2025学年高中地理鲁教版(2019)必修第二册
- DB13-T 6027-2024 超设计使用年限 医用空气加压氧舱安全性能鉴定规程
- 政府机关办公用品配送方案
- GB/T 3287-2024可锻铸铁管路连接件
- SL+174-2014水利水电工程混凝土防渗墙施工技术规范
评论
0/150
提交评论