網站首頁 編程語言 正文
問題描述:
給定n個矩陣的鏈<A1,A2,…,An>,矩陣Ai的規模為p(i-1)×p(i) (1<=i<=n),求完全括號化方案,使得計算乘積A1A2…An所需標量乘法次數最少。
動態規劃的第一步是尋找最優子結構,然后就可以利用這種子結構從子問題的最優解構造出原問題的最優解。在矩陣鏈乘法問題中,我們假設A(i)A(i+1)…A(j)的最優括號方案的分割點在A(k)和A(k+1)之間。那么,繼續對“前綴”子鏈A(i)A(i+1)…A(k)進行括號化時,我們應該直接采用獨立求解它時所得的最優方案。
遞歸實現:
①對于i=j的情況下,顯然有m=0,不需要做任何標量乘法運算。所以,對于所有的i=1、2…n,m[i,i] = 0.
②當i < j的情況,就按照最優括號化方案的結構特征進行計算m[i,j]。假設最優括號化方案的分割點在矩陣Ak和Ak+1之間,那么m的值就是Ai…k和Ak+1…j的代價加上兩者量程的代價的最小值。即。該公式的假設是最優分割點是已知的,但是實際上不知道。然而,k只有j-i中情況取值。由于最優分割點k必定在i~j內取得,只需要檢查所有可能的情況,找到最優解即可。可以得出一個遞歸公式
代碼實現【C++】
#include <iostream>
using namespace std;
#define N 6
#define MAXVALUE 1000000
void matrix_chain_order(int *p,int len,int m[N+1][N+1],int s[N+1][N+1]);
void print_optimal_parents(int s[N+1][N+1],int i,int j);
int main()
{
int p[N+1] = {30,35,15,5,10,20,25};
int m[N+1][N+1]={0};
int s[N+1][N+1]={0};
int i,j;
matrix_chain_order(p,N+1,m,s);
cout<<"m value is: "<<endl;
for(i=1;i<=N;++i)
{
for(j=1;j<=N;++j)
cout<<m[i][j]<<" ";
cout<<endl;
}
cout<<"s value is: "<<endl;
for(i=1;i<=N;++i)
{
for(j=1;j<=N;++j)
cout<<s[i][j]<<" ";
cout<<endl;
}
cout<<"The result is:"<<endl;
print_optimal_parents(s,1,N);
return 0;
}
void matrix_chain_order(int *p,int len,int m[N+1][N+1],int s[N+1][N+1])
{
int i,j,k,t;
for(i=0;i<=N;++i)
m[i][i] = 0;
for(t=2;t<=N;t++) //當前鏈乘矩陣的長度
{
for(i=1;i<=N-t+1;i++) //從第一矩陣開始算起,計算長度為t的最少代價
{
j=i+t-1;//長度為t時候的最后一個元素
m[i][j] = MAXVALUE; //初始化為最大代價
for(k=i;k<=j-1;k++) //尋找最優的k值,使得分成兩部分k在i與j-1之間
{
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; //記錄當前的括號位置,即矩陣的編號
}
}
}
}
}
//s中存放著括號當前的位置
void print_optimal_parents(int s[N+1][N+1],int i,int j)
{
if( i == j)
cout<<"A"<<i;
else
{
cout<<"(";
print_optimal_parents(s,i,s[i][j]);
print_optimal_parents(s,s[i][j]+1,j);
cout<<")";
}
}
結果
原文鏈接:https://blog.csdn.net/weixin_55764157/article/details/124417313
相關推薦
- 2022-05-17 qt 錯誤GL/gl.h: No such file or directory的解決方法
- 2024-07-15 SpringBoot使用Apache Poi導出word文檔
- 2022-11-04 react-router-dom?v6?使用詳細示例_React
- 2022-06-01 Python處理日期和時間的方法總結_python
- 2022-05-27 C++超詳細分析單鏈表的實現與常見接口_C 語言
- 2024-07-13 spring實現定時任務的動態可配置、可刪除、可啟用停用功能
- 2023-07-22 Redis使用教程之jedis客戶端sendCommand方法的byte[]入參,防止混淆strin
- 2022-06-07 Python?urllib庫的使用指南詳解_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支