期末复习——动态规划

本文深入探讨动态规划,包括基本步骤:定义最优值、自底向上计算,以及在矩阵连乘、最长公共子序列和凸多边形最优三角剖分等问题中的应用。通过实例解析动态规划的最优子结构和重叠子问题特性,展示如何利用备忘录方法提高解题效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【1】动态规划基本步骤:
(1)找出最优解的性质,并刻划其结构特征。
(2)递归地定义最优值。
(3)以自底向上的方式计算出最优值。
(4)根据计算最优值时得到的信息,构造最优解。

【2】矩阵连乘问题
给定n个矩阵{A1,A2,A3,……,An},其中Ai与Ai+1是可乘的,i=1,2,3,…..,n-1.考察这n个矩阵的连乘积A1A2A3A4,…….,An.
若一个矩阵的连乘积德计算次序完全确定,也就是说该连乘积已经完全加括号,则可以依此次序反复调用2个矩阵相乘的标准算法计算出矩阵连乘积。

void JZLC(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;
        }
    }
 } 

完全加括号的矩阵连乘积可递归地定义为:
(1)单个矩阵是完全加括号的;
(2)矩阵连乘积A是完全加括号的,则A可表示为2个完全 加括号的矩阵连乘积B和C的乘积并加括号,即: A=(BC)
设有四个矩阵A,B,C,D ,它们的维数分别是:
A=50×10, B=10×40, C=40×30, D=30×5
总共有五种完全加括号的方式
(A((BC)D) (A(B(CD))) ((AB)(CD))
(((AB)C)D) ((A(BC))D)
16000, 10500, 36000, 87500, 34500
设计算A[i:j],1<=i<=j<=n,所需要的最少乘法次数m[i:j],则原问题的最优值为m[1,n]

i=j时,A[i:j]=Ai,因此,m[i,i]=0,i=1,2,3,.....,n
    当i<j时:m[i,j]=m[i,k]+m[k+1,j]+P(i-1)P(k)P(j),这里A的维数为P(i-1)*P(i)
    k的位置只有j-i种可能。
Description
已知一组连乘矩阵的各维长度,要求计算并输出计算量最小的计算顺序表达式。
Input
每行为一组连乘矩阵的各维长度,行中第一个数字是连乘矩阵的个数n,n≤100,后面是n+1个维长。 矩阵个数为0表示输入结束。
Output
对每行输入,计算最优计算顺序,并以括号形式将计算表达式输出,各矩阵用A0, A1, ..的形式表示。
Sample Input
1 10 20
2 10 20 30
3 10 20 30 40
6 30 35 15 5 10 20 25
0
Sample Output
A0
A0A1
(A0A1)A2
(A0(A1A2))((A3A4)A5)
#include<iostream>  
#include<cstring>  
#include<algorithm>  
#include<cstdio>  
using namespace std;  
const int MAX=1010;  
int p[MAX],m[MAX][MAX],s[MAX][MAX];  
int n;  
void MATRIX_CHAIN_ORDER()  
{  
    for(int i=
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值