文章目录

  • 1、 数字三角问题
  • 2、最长公共子序列问题
  • 3、日常购物
  • 4、台阶问题

一、实验目的:
掌握动态规划算法的基本思想及适用条件,掌握动态规划算法的设计步骤和具体实现。

二、实验所用仪器及环境
Windows 7 以上操作系统,PC机,codeblocks环境

三、实验原理:
算法总体思想:动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题但是经分解得到的子问题往往不是互相独立的。不同子问题的数目常常只有多项式量级。在用分治法求解时,有些子问题被重复计算了许多次。如果能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,就可以避免大量重复计算,从而得到多项式时间算法。
动态规划算法设计步骤:
(1)找出最优解的性质,并刻划其结构特征。
(2)递归地定义最优值。
(3)以自底向上的方式计算出最优值。
(4)根据计算最优值时得到的信息,构造最优解。

四、实验内容:

1、 数字三角问题

问题描述:给定一个由n行数字组成的数字三角形,如下图所示
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5

试设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大。
如上图最大值为30=7+3+8+7+5

#include <iostream>
#include<bits/stdc++.h>
using namespace std;
int a[100][100]={0};
int mem[100][100]={0};
int n;
int memd[100][100]={0};
int dp(int p,int q){if(mem[p][q]!=0){return mem[p][q];}if(p==n){mem[p][q]=a[p][q];return mem[p][q];}if(dp(p+1,q)>=dp(p+1,q+1)){memd[p][q]=q;}else{memd[p][q]=q+1;}mem[p][q]=max(dp(p+1,q),dp(p+1,q+1))+a[p][q];return mem[p][q];
}int main()
{cin>>n;for(int i=1;i<=n;i++){for(int j=1;j<=i;j++){cin>>a[i][j];}}//cout<<dp(1,1)<<"=";int qt,pt;qt=pt=1;for(int i=1;i<=n;i++){cout<<a[i][pt];if(i!=n){cout<<"+";}pt=memd[i][pt];}return 0;
}
//in
//5
//7
//3 8
//8 1 0
//2 7 4 4
//4 5 2 6 5
//out
//30

2、最长公共子序列问题

问题描述:给定两个序列X={x1,x2,…,xm}和Y={y1,y2,…,yn},找出X和Y的最长公共子序列。
输入:
第1行:两个子序列的长度,m n
第2行:第1个子序列的各个元素(序列下标从1开始)
第3行:第2个子序列的各个元素(序列下标从1开始)
输出:
最长公共子序列
实例:
输入:
第1行:
4 5 //m和n的值
第2行
abad //输入4个字符,下标从1开始
第3行
baade //输入5个字符,下标从1开始
输出:
Aad

#include<bits/stdc++.h>
using namespace std;
int recdp[1000][1000]= {0};char str1[1000];
char str2[1000];int dp(int i,int j)
{///让数组头从开始,dp0,与dp,0都代表空串///baseif(i==0||j==0)return 0;///recif(recdp[i][j]!=0){return recdp[i][j];}///相同时直接+1/// 当这里直接使用图中的0为空字符串时,一定记得,str也是从0开始计算的,所以第五个字符应该是str[4]//if(str1[i-1]==str2[j-1]){recdp[i][j]=dp(i-1,j-1)+1;return recdp[i][j];}else{///不同时直接选大的(我也不知道谁大,那就比比吧)(可能,要1,可能要2,****可能都不要)
///不需要两个都不要,两个都不要的话,第一次不要1,第二次不要2就行了,而且也不会,因为两个都不要一定是最小的
///*******不同时不要+1recdp[i][j]=max(dp(i-1,j),dp(i,j-1));return recdp[i][j];}return 0;
}
int main()
{//cout << "Hello world!" << endl;cin>>str1;cin>>str2;cout<<dp(strlen(str1),strlen(str2));return 0;}///abcde
///ace
///out
//3

3、日常购物

问题描述:小明今天很开心,因为在家买的新房子即将拿到钥匙。新房里面有一间他自己专用的、非常宽敞的房间。让他更高兴的是,他的母亲昨天对他说:“你的房间需要购买什么物品?怎么布置,你说了算,只要他们的价格总和不超过N元钱”。小明今天早上开始预算,但他想买太多的东西,肯定会超过母亲的N元限额。因此,他把对每件物品的渴望程度,分为5等级:用整数1->5表示,第5等表示最想要。他还从互联网上找到了每件商品(所有整数)的价格。他希望在不超过N元(可能等于N元)的情况下,将每件商品的价格与效益度的乘积的总和最大化.
设第j件物品的价格为p[j],重要度为w[j],其选中的k件商品,编号依次为j1,j2,……,jk,则所求的总和为:
p[j1]×w[j1]+p[j2]×w[j2]+ …+p[jk]×w[jk]。
请帮小明设计一个符合要求的购物清单。
其中N=2000,K=6
p[1]=200 w[1]=2
p[2]=300 w[2]=2
p[3]=600 w[3]=1
p[4]=400 w[4]=3
p[5]=1000 w[5]=4
p[6]=800 w[6]=5

#include <iostream>
#include<bits/stdc++.h>
using namespace std;
int p[10000]={0};
int w[10000]={0};
int mem[10000]={0};int dp(int n,int k){for(int i=0;i<k;i++){for(int j=n;j>=p[i];j--){mem[j]=max(mem[j],mem[j-p[i]]+p[i]*w[i]);}}return mem[n];
}
int main()
{int n,k;cin>>n>>k;for(int i=0;i<k;i++){cin>>p[i]>>w[i];}cout<<dp(n,k);return 0;
}
//in
//2000 6
//200 2
//300 2
//600 1
//400 3
//1000 4
//800 5
//out
//8400

4、台阶问题

问题描述:有n级台阶,一个人每次上一级或者两级,问有多少种走完n级台阶的方法。
实际情况:给定一个矩阵m,从左上角开始每次只能向右走或者向下走,最后达到右下角的位置,路径中所有数字累加起来就是路径和,返回所有路径的最小路径和,如果给定的m如下,那么路径1,3,1,0,6,1,0就是最小路径和,返回12.
1 3 5 9
8 1 3 4
5 0 6 1
8 8 4 0

#include <iostream>
#include<bits/stdc++.h>
using namespace std;
int mem[1000]={0};
int dp(int n)
{if(n==1){return 1;}if(n==2){return 2;}if(mem[n]!=0){return mem[n];}mem[n]=dp(n-1)+dp(n-2);return mem[n];
}
int main()
{int n;cin>>n;cout<<dp(n);return 0;
}
//in
//12
//233

五、实验结果与分析:
通过运行程序验证程序的正确性,给出程序运行结果,分析程序出现的bug的原因,调试程序过程种出现的错误和解决方法。

算法分析与设计-实验二 动态规划算法设计相关推荐

  1. Python算法分析与设计实验:动态规划算法

    Python算法分析与设计实验:动态规划算法 一.实验目的 1.理解动态规划求解优化问题的典型步骤,以及动态规划算法求解计算问题的时间复杂度分析 2.熟练掌握利用动态规划算法求解一维.二维等典型优化问 ...

  2. 算法分析与设计-实验三 贪心算法设计

    文章目录 1.最优服务次序问题 2.区间相交问题 3.汽车加油问题 4.活动安排问题:考虑将一系列活动安排在科学会堂.假设有n个活动,每个活动需要花费一个单位时间.如果在时间T[i]或T[i]之前开始 ...

  3. 实验二 动态规划算法 最大字段和问题

    基本题二:最大字段和问题 一.实验目的与要求 1.熟悉最长最大字段和问题的算法: 2.进一步掌握动态规划算法: 二.实验题 若给定n个整数组成的序列a1,a2,a3,...,an,求该序列形如ai+a ...

  4. 实验二 动态规划算法 最长公共子序列问题

    基本题一:最长公共子序列问题 一.实验目的与要求 1.熟悉最长公共子序列问题的算法: 2.初步掌握动态规划算法: 二.实验题 若给定序列X={x1,x2,…,xm},则另一序列Z={z1,z2,…,z ...

  5. 算法分析与设计-实验四 回溯算法设计

    文章目录 1.0-1背包问题 2.旅行售货员问题 3.图的m着色问题 一.实验目的: 掌握用回溯法解题的算法框架:根据回溯法解决实际问题. 二.实验所用仪器及环境 Windows 7 以上操作系统,P ...

  6. 实验05:算法设计策略的比较与选择

    1.实验目的: 比较同一问题,采用不同策略设计不同算法,分析和比较算法的性能. 2.实验内容: 自学第10章的10.1.1至10.1.3, 总结分析编程实现简单算法.分治法和动态规划算法的理论复杂度, ...

  7. 网页设计实验二( 格式化文本、段落与列表)

    网页设计实验二 一 文本与段落标记的应用 二 设计新闻访问列表 三 设计制度宣传展板 四 制作饭店菜单价目表 五 设计简易 Web 页面 六 设计食品安全管理制度页面 +++点击资源索引[查看其它实验 ...

  8. 山东大学计算机组成与设计实验二逻辑运算电路

    山东大学计算机组成与设计实验二逻辑运算电路 山东大学计算机组成与设计实验 山东大学计算机组成与设计实验报告 计算机组成原理实验报告 山东大学计算机组成原理实验报告 文章目录 实验题目:逻辑运算电路 实 ...

  9. 程振波 算法设计与分析_算法设计与分析

    本书按照教育部*制定的计算机科学与技术专业规范的教学大纲编写,努力与国际计算机学科的教学要求接轨.强调 算法 与 数据结构 之间密不可分的联系,因而强调融数据类型与定义在该类型上的运算于一体的抽象数据 ...

最新文章

  1. 图像遍历反色处理,遍历多通道图片
  2. Opencv中IplImage的四字节对齐问题
  3. 热敏打印机原理java_java - 使用TSC TTP-342E Pro热敏打印机Java打印 - 堆栈内存溢出...
  4. Vue.js 介绍及其脚手架工具搭建
  5. Fiddle改包场景01——拦截请求,修改请求,放行请求
  6. Autofac Webapi 的依赖注入
  7. python安装-在Python中安装包的三种方法
  8. ant centos环境下 编译没有将配置文件加载_Linux 下的动态库、静态库与环境变量...
  9. 全网首发:编译链接错误:对‘vtable for xxxx’未定义的引用
  10. oracle设置禁用外键,oracle禁用表外键
  11. lua jit android,某LuaJit游戏解密教程~~
  12. 一个更高效的RACK机制
  13. 深入理解网络通信与tcp/ip协议
  14. ModuleNotFoundError: No module named ‘tensorflow‘
  15. Delphi API
  16. linux下的EC20的监控python脚本
  17. 银河麒麟桌面操作系统V10上安装使用MySQL5.7、MySQL Workbench
  18. Python+uiautomator2手机UI自动化测试实战 -- 2. 用法介绍
  19. Delphi_调用DLL方法[创建对象下面的方法]
  20. vlc activex调用

热门文章

  1. log4j控制台乱码解决办法
  2. 【转】golang-defer坑的本质
  3. Markdown的常用语法
  4. 标准C程序设计七---53
  5. ABAP DESCRIBE语句
  6. linux可以ping通,Linux可以Ping通但不能traceroute
  7. mac怎么实现文件读写c语言,使用Sublime Text和Xcode在Mac上进行文件输入/输出。 C语言...
  8. axure能做剪切蒙版吗_大理石结晶自己能做吗?
  9. android 应用状态,保持应用程序状态在Android上
  10. 五十八、Vue中的计算属性,方法和侦听器