7-1 矩阵链相乘问题 (20 分)(思路+详解+题目解析) 动态规划做法
一:題目:
輸入樣例:
在這里給出一組輸入。例如:
輸出樣例:
在這里給出相應的輸出。例如:
二:基本解析
1.基本的動態規劃知識:
1):求解過程是多階段決策過程,每步處理一個子問題,可用于求解組合優化的問題
含義:通過把復雜的原問題分解為相對簡單的的子問題的方法
(2):優化原則:一個最優決策序列的任何子序列本身一定是相對于子序列的初始和結束狀態的最優決策序列
(3):動態規劃有哪些特征(判斷是否是動態規劃的關鍵)
重疊子問題,最優子結構,無后效性
◆重疊子問題:子問題重復出現
◆最優子結構:一個問題的最優解包含其子問題的最優解
◆無后效性:某階段的狀態一旦確定,則此后過程的演變不再受此前各種狀態及決策的影響。
(4):動態規劃設計要素
1>.問題建模,優化的目標函數是什么?約束條件是什么?
2>.如何劃分子問題(邊界) ?
3>.問題的優化函數值與子問題的優化函數值存在著什么依賴關系?(遞推方程)
4>.是否滿足優化原則?
5.>最小子問題怎樣界定?其優化函數值,即初值等于什么?
2:關于本題的矩陣乘法和遞推方程的得出
3:實例演示
三:思路
思路:這里在考慮的的時候,因為是多個矩陣相乘,求的最小乘法次數,
比如 A1A2A3A4, 那么根據劃分的不同,那么其乘法順序也會不同,繼而所求的乘法次數也不一樣
劃分:((A1A2)*A3) *A4 等等,那么再求解最小乘法次數的時候,這就涉及到是個
動態的過程
在用 動態劃分的思想做的時候,先創建一個二維數組,用來存放不同個數矩陣相乘的
最小乘法次數,然后根據劃分 來求得最小的乘法次數
四:上碼
/*思路:這里在考慮的的時候,因為是多個矩陣相乘,求的最小乘法次數,比如 A1*A2*A3*A4, 那么根據劃分的不同,那么其乘法順序也會不同,繼而所求的乘法次數也不一樣劃分:((A1*A2)*A3) *A4 等等,那么再求解最小乘法次數的時候,這就涉及到是個動態的過程 在用 動態劃分的思想做的時候,先創建一個二維數組,用來存放不同個數矩陣相乘的最小乘法次數,然后根據劃分 來求得最小的乘法次數 */#include<bits/stdc++.h> using namespace std;int N; int p[1000]; int m[1000][1000]; //m[i][j] 即表示:A(i)A(i+1)(i+2)...A(j); int minimum_num(){//初始化矩陣,一個矩陣乘法次數為0 for(int i = 1; i <= N; i++)m[i][i] = 0;//向二維數組中添加數據,并更新(求最小),for(int i = N; i >= 1; i--){//這里的i 從 N 先開始,不能從1 先開始,因為一旦從1開始 //那么的話 m[1][N],就在第一次循環便求出,那么m[1][N]在劃分 //更新的時候,其中的一些值尚未求出來。如果從N開始,那么最后求得是//m[1][N],這樣就可以用到了前面已經求出的一些值for(int j = i + 1; j <= N; j++){//任何一個m[i][j],均可這樣先表示出來 即從 i 后面開始劃分 m[i][j] = m[i][i] + m[i+1][j] + p[i-1]*p[i]*p[j]; //劃分更新for(int k = i + 1;k < j; k++){//這里 k = i + 1 ,表示的是從i+1后面開始劃分,//因為上方第一次表示出來的時候,就已經是從 i 后面劃分了 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;}} } } return m[1][N];}int main(){cin >> N;for(int i = 0; i < N + 1; i++){cin >> p[i];}int result = minimum_num();cout << result;}
加油 寶貝!!!!!!!!!!!
總結
以上是生活随笔為你收集整理的7-1 矩阵链相乘问题 (20 分)(思路+详解+题目解析) 动态规划做法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 英特尔酷睿 Ultra 155H / 1
- 下一篇: 7-2 最长公共子序列 (10 分)(思