沙子劃分,矩陣連乘的變形

2022-05-09 09:09:09 字數 1195 閱讀 9488

/**

* @author fizz pu

* @date 2020/10/11 下午18:25

* @version 1.0

* 失之毫釐,繆之千里!

*//**

* 題目描述

* 設有n堆沙子排成一排,其編號為1,2,3,…,n(n< =300)。每堆沙子有一定的數量,可以用乙個整數來描述,現在要將n堆沙子合併成為一堆,

* 每次只能合併相鄰的兩堆,合併的代價為這兩堆沙子的數量之和,合併後與這兩堆沙子相鄰的沙子將和新堆相鄰,

* 合併時由於選擇的順序不同,合併的總代價也不相同,如有4堆沙子分別為1 3 5 2我們可以先合併1、2堆,代價為4,

* 得到4 5 2又合併1,2堆,代價為9,得到9 2,再合併得到11,總代價為4+9+11=24,如果第二步是先合併2,3堆,則代價為7,

* 得到4 7,最後一次合併代價為11,總代價為4+7+11=22;問題是:找出一種合理的方法,使總的代價最小。輸出最小代價。

* 輸入

* 第一行乙個數n表示沙子的堆數n。 第二行n個數,表示每堆沙子的質量。 a[i]< =1000。

* 輸出

* 合併的最小代價。

* 樣例輸入

41 3 5 2

* 樣例輸出

22 */

// 分析,這道題目和矩陣矩陣連乘問題一樣

// 1.cost[n][n]中,cost[i][j] 表示合併i:j堆沙子需要的代價

// 2.初始化矩陣

// 2.1沙子只有一堆,代價為0

// 2.2沙子有兩堆,代價為數量之和

// 3 沙子有三堆以上,找出狀態轉移方程 cost[i][j] = cost[i][k] + cost[k+1][j] + i到j堆沙子的總和 ;迴圈找k

// 我的天啊!自己還是不小心!遇到個小錯誤

#include int getmincost(int*, int);

void dp(int *, int **);

int max(int, int);

int main()

std::coutsums = 0;

for(int m = row-1; m <= col-1; ++m)

if(i == 2) else}}

}return cost[0][len-1];

}

c 矩陣連乘的動態規劃演算法並輸出 矩陣連乘

問題描述 給定n個矩陣a1,a2,an,其中,ai與aj 1是可乘的,i 1,2,n l。你的任務是要確定矩陣連乘的運算次序,使計算這n個矩陣的連乘積a1a2 an時總的元素乘法次數達到最少。例如 3個矩陣a1,a2,a3,階分別為10 100 100 5 5 50,計算連乘積a1a2a3時按 a1...

動態規劃 矩陣連乘的問題

動態規劃 矩陣連乘的問題 問題的引出 看下面乙個例子,計算三個矩陣連乘 維數分別為10 100 100 5 5 50 按此順序計算需要的次數 a1 a2 a3 10x100x5 10x5x50 7500次 按此順序計算需要的次數 a1 a2 a3 10x5x50 10x100x50 75000次 所...

動態規劃 矩陣連乘的問題

問題的引出 看下面乙個例子,計算三個矩陣連乘 維數分別為10 100 100 5 5 50 按此順序計算需要的次數 a1 a2 a3 10x100x5 10x5x50 7500次 按此順序計算需要的次數 a1 a2 a3 10x5x50 10x100x50 75000次 所以問題是 如何確定運算順序...