第三章动态规划小结

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]}

结对编程的汇报情况:

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

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

相关推荐