UVA 348 Optimal Array Multiplication Sequence (区间DP)

本文探讨了矩阵连乘问题及其动态规划解决方案。通过定义状态方程,实现了矩阵连乘最小运算次数的求解,并提供了完整的C++实现代码。

题目链接~~>

做题感悟:这题上来一看就是矩阵连成,就是输出的时候有点不好输出。

解题思路:矩阵连乘:状态方程 ->   dp[ i ][ j ] = min{ dp[ i ][ k ] +dp[ k+1 ][ j ] + p[ i ] * p[ k ]*p[ j ] }

代码:

#include<stdio.h>
#include<vector>
#include<queue>
#include<string.h>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#define INT __int64
const int INF = 99999999 ;
using namespace std ;
const int MX = 100 + 10 ;
int n ;
int m[MX][MX],s[MX][MX],p[MX] ;
void Matrix()
{
    for(int i=1 ;i<=n ;i++)
    {
        m[i][i]=0 ;
        s[i][i]=0 ;
    }
    for(int r=2 ;r<=n ;r++)
     for(int i=1 ;i<=n-r+1 ;i++)
     {
         int j=i+r-1 ;
         m[i][j]=m[i+1][j]+p[i-1]*p[i]*p[j] ;
         s[i][j]=i ;
         for(int k=i+1 ;k<j ;k++)
         {
             int temp=m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j] ;
             if(temp<m[i][j])
             {
                 m[i][j]=temp ;
                 s[i][j]=k ;
             }
         }
     }
}
void print(int i,int j)
{
    if(i==j)
    {
        cout<<"A"<<i ;
        return ;
    }
    cout<<"(" ;
    print(i,s[i][j]) ;
    cout<<" x " ;
    print(s[i][j]+1,j) ;
    cout<<")" ;
}
int main()
{
    int x,cse=1 ;
    while(scanf("%d",&n),n)
    {
        scanf("%d",&p[0]) ;
        for(int i=1 ;i<=n ;i++)
        {
            scanf("%d",&p[i]) ;
            if(i!=n)
            scanf("%d",&x) ;
        }
        Matrix() ;
        cout<<"Case "<<cse++<<": " ;
        print(1,n) ;
        cout<<endl ;
    }
    return 0 ;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Muti-Agent

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值