第三章动态规划小结

动态规划

3.1、矩阵连乘问题

标准算法:

 1 void matrixMultiply(int **a,int **b,int **c,int ra,int ca, int rb,int cb){
 2     if(ca !=rb)
 3         error("矩阵不可乘");
 4     for(int i=0;i<ra;i++){
 5         for(int j=0;j<cb;j++){
 6             int sum = a[i][0]*b[0][j];
 7             for(int k=1;k<ca;k++)
 8                 sum+=a[i][k]*b[k][j];
 9             c[i][j] = sum;
10             }
11         }
12 }

矩阵连乘问题的标准算法

动态规划法解法步骤:

①分析最优解的结构:刻画该问题的最优解的结构特征,矩阵连乘积计算次序问题的最优解包含着其子问题的最优解——最优子结构性质。

②建立递归关系

作业题

3-1 单调递增最长子序列

 1 #include<iostream>
 2 using namespace std;
 3
 4 int main(){
 5     int n;//n个数字
 6     cin >> n;
 7     int a[n];
 8     for(int i=0;i<n;i++){
 9         cin >> a[i];
10     }
11
12     int m[n] = {1};
13     int max=0;
14     for(int i=1;i<n;i++){
15         for(int j=0;j<i;j++){
16             if(a[i] > a[j] && m[i] < m[j]+1) {
17                 m[i] = m[j] +1;
18             }
19         }
20     }
21     for(int i=0;i<n;i++){
22         if(max < m[i])
23             max = m[i];
24     }
25     cout << max;
26     return 0;
27 } 

单调递增最长子序列

题目分析:

1.数据结构

①a[n]存放n个数;②bool Islarger[n]用于判断a[i]>a[i-1]为true or false; ③int flag用于标记是否进行过lslarger的判断;④ int length用于存放单调递增序列的长度

2.递归方程

length = max{a[i]>a[i-1],0}+1

①由于只有一个数的时候,序列长度为1 ,因此后面加了一个1

②当a[i]>a[i-1]时 为递增,a[i]>a[i-1]返回1,因此max{a[i]>a[i-1],0}返回1 ,length加一即序列长度加一

  当a[i]<a[i-1]时 非递增, a[i]<a[i-1]返回-1,因此max{a[i]>a[i-1],0}返回0,length长度不变

3-2 租用游艇问题

 1 #include<iostream>
 2 using namespace std;
 3
 4 int main(){
 5     int n;
 6     cin >> n;//n个游艇出租站
 7     int boat_rent[200][200];
 8     int rent[n][n];
 9     for(int i=1;i<=n;i++){
10         boat_rent[i][i]=0;
11     }
12
13     for(int i=1;i<n;i++){
14         for(int j=i+1;j<=n;j++){
15             cin >> boat_rent[i][j];
16         }
17     }
18     for(int i=1;i<n;i++){
19         for(int j=i+1;j<=n;j++){
20             rent[i][j] = boat_rent[i][j];
21         }
22     }
23     int  k;
24     for(int i=2;i<=n;i++){//到第i个站点
25         for(int j=i+1;j<=n;j++){//从每一个站点开始
26             k = j-i;//r(i,j)长度为j
27             for(int p=k;p<j;p++){//找出某一站k,使得r(i,k)+r(k,j)最小
28                 if(boat_rent[k][j] > boat_rent[k][p]+boat_rent[p][j])
29                     boat_rent[k][j]=boat_rent[k][p]+boat_rent[p][j];
30             }
31         }
32     }
33     cout << boat_rent[1][n];
34     return 0;
35 }
36  

租用游艇问题

代码分析:

1)数据结构:

①int boat_rent[][]:定义每个出租站到另外一个出租站的租金;②int  k:从中间的站点分开,选择从起始站点到终点最短的距离;③rent[][]将boat_rent重新填入rent[][]

2)递归函数

rent[1][n] = min{boat_rent[1][k]+boat_rent[k][n],boat_rent[1][n]}

结对编程的汇报情况:

这次结对编程我们写的是数字三角形、最大字段和和编辑距离问题,在课上我们只做出了数字三角形一道题,是利用了直接在表上重新填写的方法,利用了填表法的思想,但是没有另建一个表格。后来在写最大字段和的时候,我们的确卡住了,想要算两个正数之间的和,但是又考虑到重复问题,最后下课了也没有解决这个问题。

而这三道题中,我们觉得最难的是编辑距离问题,在网上查找了之后,依旧没有弄懂,希望老师能讲一下这道题。

原文地址:https://www.cnblogs.com/snowlxy/p/11694043.html

时间: 2024-10-19 20:54:57

第三章动态规划小结的相关文章

第三章学习小结—-转

[学习目标] 01掌握一维数组的声明和使用方法(OK) 02掌握二维数组的声明和使用方法(OK) 03掌握字符串的声明.赋值.比较和连接方法(连接很少用) 04熟悉字符的ASCII码和ctype.h中的字符函数 05正确认识++.+=等能修改变量的运算符(OK) 06学会用编译选项-Wall获得更多的警告信息(OK) 07了解不同操作系统中换行符的表示方法(嗯) 08掌握fgetc和getchar的使用方法(fgetc基本没用过) 09掌握预处理和迭代开发的技巧(嗯) 程序3-1 逆序输出 输入

第三章内容小结

1.内容小结:在第三章的学习中我们学习到了两种特殊的线性表:栈和队列. (1)特殊性:栈:限定仅在表尾(栈顶)进行插入或者删除的线性表,后进先出. 队列:只允许在表的一端进行插入(队尾),而在另一端(队头)进行删除的线性表.先进先出. (2)存储方式:顺序存储(顺序栈:循环队列)和链式存储(链栈:链队). (3)主要操作: 栈:入栈和出栈.对于顺序栈的入栈和出栈操作前要判断栈满或栈空. 队列:入队和出队.对于顺序队的循环队列进队和出队操作要判断队满或队空.涉及队头或队尾指针的修改都要将其对MAX

ch3第三章的小结——杨智雯

第四周c++学习情况. 学习情况:周一在实验室上了第三章的输入输出流,上课状态良好,老师讲的都明白了.周三老师讲解了师兄给我解释过的数组问题,但是还是不是很懂,了解了直接用c1之类的字符型直接加减数字来使输出发生变化,并学习了如何使字符型变量变成表格中的数字号码. 遇到的困难:可是ch3中的编程作业统计和保留小数的问题,老师应该是没有讲到的,我并不会啊!!/(ㄒoㄒ)/~~咨询了师兄,可是按照师兄的解法还是输出不了啊!!!实验二的内容经过老师的讲解基本上都解决了问题,再acm培训课程中也了解了具

第三章学习小结

第三章主要学习了关于栈和队列的知识,知道了有关栈和队列的初始化和基本操作.栈是只在一头进行插入与删除操作的数据结构,而队列是可以在两头进行插入与删除操作的数据结构.此外栈和队列分别可以分为链栈与顺序栈,链队与顺序队列.栈的特点是先进后出,队列的特点是先进先出. 在这里分享有关栈的函数: #include <stack> //头文件 stack <elemtype> L //定义栈 push():L.push(x) 将数据x放在栈顶 top():L.top()返回栈顶元素 pop()

汇编语言第三章小结

第三章 内存访问 字数据在内存中的存储 1.      内存以字节为单位,划分为若干个单元 2.      字数据的存-取原则:高-高  低-低(小端法) 即: ① 字数据的低位字节存放在低地址内存单元 字数据的高位字节存放在高地址内存单元 ② 取低地址内存单元地址作为字数据地址 例1: 字数据124EH的地址是( 1 ) 字数据3020H存入内存后地址为4,则4存放( 30H ),3存放( 20H ) 例2: 从地址单元1取出一个 (1)     字节数据为:  4EH (2)     字数据

第三章小结--栈与队列

第三章小结 第三章我们主要学习了栈和队列.经过第一次的写博客,与课后的学习与借鉴.我看到很多其他的同学在整理知识的时候采用了画大纲图,架构图的方法.不得不说,那样子确实比纯粹的文字更加简单明了.于是我决定也学习和效仿一下. 以下便是图解: 通过大图来看,很明显,和前面学习的顺序表,链表栈和队列的操作有同工异曲之妙.实际上围绕着栈和队列的也是分为两大分支,顺序表和链表.操作也是从初始化,插入,删除,查找几个操作入手. 当然,也有不同的地方,栈是典型的先进而后出,队列则是先进先出,其插入和删除的操作

DS第三章小结

一.你对本章内容的小结 本章主要讲了两种特殊的线性表,栈和队列.栈是仅在表尾进行插入或删除操作且后进先出(LIFO)的线性表,而队列则是在表的一端插入,另一端删除元素且先进先出(FIFO)的线性表.同时,课本的案例引入告诉我们,栈可以解决数值的转换,括号匹配的检验问题:而队列因其结构的吻合可以用了舞伴问题. 下面是本章的思维导图.对我来说,第三章比第二章更抽象,晦涩,难懂,仍然需要通过练习来对机械地吸收的知识加以运用. 二.完成作业实践时的心得体会 首先还是要多看课本,把基本的入栈,出栈,入队,

揭露动态规划真面目——算法第三章上机实践报告

算法第三章上机实践报告 一.        实践题目 7-2 最大子段和 (40 分) 给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的子段和的最大值.当所给的整数均为负数时,定义子段和为0. 要求算法的时间复杂度为O(n). 输入格式: 输入有两行: 第一行是n值(1<=n<=10000): 第二行是n个整数. 输出格式: 输出最大子段和. 输入样例: 在这里给出一组输入.例如: 6 -2 11 -4 13 -5

JAVA-初步认识-第三章-小结

一. 概论 第三章讲述的是JAVA语言基础,分为八个部分:关键字,标识符,注释,常量和变量,运算符,语句,函数和数组. →运算符(对于某种操作,浓缩为符号,上层的程序员采用这种符号.底层根据符号的不同,对数据做出不同的操作.) →要了解运算符的本质.→运算符的诞生,还是源于计算机程序语言的设计特点决定的. →计算机语言是对现实世界的,解析,重构.(用特定的计算机语言结构,但是最终的结果是一样的,过程也是一样的,和现实中的计算相比) 注意:用另一种方式,来重现现实世界的过程和结果. 用运算符对一些