ustbfym 2019-11-03
动态规划
3.1、矩阵连乘问题
标准算法:
void matrixMultiply(int **a,int **b,int **c,int ra,int ca, int rb,int cb){ if(ca !=rb) error("矩阵不可乘"); for(int i=0;i<ra;i++){ for(int j=0;j<cb;j++){ int sum = a[i][0]*b[0][j]; for(int k=1;k<ca;k++) sum+=a[i][k]*b[k][j]; c[i][j] = sum; } } }
矩阵连乘问题的标准算法
动态规划法解法步骤:
①分析最优解的结构:刻画该问题的最优解的结构特征,矩阵连乘积计算次序问题的最优解包含着其子问题的最优解——最优子结构性质。
②建立递归关系
作业题
3-1 单调递增最长子序列
#include<iostream> using namespace std; int main(){ int n;//n个数字 cin >> n; int a[n]; for(int i=0;i<n;i++){ cin >> a[i]; } int m[n] = {1}; int max=0; for(int i=1;i<n;i++){ for(int j=0;j<i;j++){ if(a[i] > a[j] && m[i] < m[j]+1) { m[i] = m[j] +1; } } } for(int i=0;i<n;i++){ if(max < m[i]) max = m[i]; } cout << max; return 0; }
单调递增最长子序列
题目分析:
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 租用游艇问题
#include<iostream> using namespace std; int main(){ int n; cin >> n;//n个游艇出租站 int boat_rent[200][200]; int rent[n][n]; for(int i=1;i<=n;i++){ boat_rent[i][i]=0; } for(int i=1;i<n;i++){ for(int j=i+1;j<=n;j++){ cin >> boat_rent[i][j]; } } for(int i=1;i<n;i++){ for(int j=i+1;j<=n;j++){ rent[i][j] = boat_rent[i][j]; } } int k; for(int i=2;i<=n;i++){//到第i个站点 for(int j=i+1;j<=n;j++){//从每一个站点开始 k = j-i;//r(i,j)长度为j for(int p=k;p<j;p++){//找出某一站k,使得r(i,k)+r(k,j)最小 if(boat_rent[k][j] > boat_rent[k][p]+boat_rent[p][j]) boat_rent[k][j]=boat_rent[k][p]+boat_rent[p][j]; } } } cout << boat_rent[1][n]; return 0; }
租用游艇问题
代码分析:
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]}
结对编程的汇报情况:
这次结对编程我们写的是数字三角形、最大字段和和编辑距离问题,在课上我们只做出了数字三角形一道题,是利用了直接在表上重新填写的方法,利用了填表法的思想,但是没有另建一个表格。后来在写最大字段和的时候,我们的确卡住了,想要算两个正数之间的和,但是又考虑到重复问题,最后下课了也没有解决这个问题。
而这三道题中,我们觉得最难的是编辑距离问题,在网上查找了之后,依旧没有弄懂,希望老师能讲一下这道题。
动态规划有时被称为递归的相反的技术。动态规划方案通常使用一个数组来建立一张表,用于存放被分解成众多子问题的解。当算法执行完毕,最终的解法将会在这个表中找到。今天我们先从我们最熟的斐波那契数列数列开始。
#include <iostream> #include <algorithm> #include <cstring> #include <cstdio&am