區間DP,子問題的深刻理解

2021-08-01 15:43:40 字數 1076 閱讀 2183

演算法提高 矩陣乘法  

時間限制:3.0s   記憶體限制:256.0mb

問題描述

有n個矩陣,大小分別為a0*a1, a1*a2, a2*a3, ..., a[n-1]*a[n],現要將它們依次相乘,只能使用結合率,求最少需要多少次運算。

兩個大小分別為p*q和q*r的矩陣相乘時的運算次數計為p*q*r。

輸入格式

輸入的第一行包含乙個整數n,表示矩陣的個數。

第二行包含n+1個數,表示給定的矩陣。

輸出格式

輸出乙個整數,表示最少的運算次數。

樣例輸入 3

1 10 5 20

樣例輸出

150資料規模和約定

1<=n<=1000, 1<=ai<=10000。

之前一直是執行錯誤,原來是陣列開大了,多看了乙個0,實在是不應該,也提醒自己國賽要細心審題。

這道題可以說是我自己想出來的吧,核心思想是我自己想出來的,有幾處bug是參照的別人的**找出來的,

包括memset怎麼初始化無窮大,這就涉及16進製制了,還有就是我的inf不夠大,導致出現錯誤。

這個區間dp的**我寫的很快,但就是不對,我是怎麼找都找不到,實在沒轍了我想我拿個例子模擬一下看**出錯了。然後真的就讓我給找出來了。我之前的問題**是這樣的:

for(i=1;i

dp[1][1]+dp[2][4],請問,dp[2][4]在這之前計算出來了嗎?顯然沒有,所以說這不就錯了嘛!我為什麼會寫錯!?因為我並沒有理解什麼叫做子問題,我們在求遞推式時,等式右邊的dp陣列必須得是已經計算好了的,要不然就不對。

#includeusing namespace std;

const long long inf = 100000000000000000ll;

struct matrix

;matrix m[1004];

int n;

long long dp[1004][1004];

int main()

for(i=0;i<1004;i++)

for(j=0;j<1004;j++)

dp[i][j]=inf;

for(i=1;i

對MapReduce Yarn的深刻理解

1.mapreduce詳細工作流程之map階段 2.mapreduce流程之reduce階段巨集觀上看 reducetask分為四個階段 1.copy 2.merge 3.sort 4.reduce 1.copy reducetask將遠端從maptask上覆制過來要處理的資料,針對某一片資料,如果...

深刻理解結構體的記憶體對齊問題

1 為什麼要對結構體內存對齊?了解計算機的人都知道,cpu是沒有辦法來儲存資料的,cpu只有計算能力。所以,儲存資料的任務就交給了記憶體。那麼,當cpu需要計算的時候,就需要從記憶體上獲取資料,記憶體上資料和位址是對應的,cpu只要知道對應資料的位址,就可以呼叫資料了。知道了cpu必須定址之後,我們...

深刻理解Vue中的元件

今天看了下vue官網上關於元件的教程,感覺內容還挺多,現在把元件中基本的知識梳理一下。註冊元件就是利用vue.component 方法,先傳入乙個自定義元件的名字,然後傳入這個元件的配置。vue.component mycomponent 如上方式,就已經建立了乙個自定義元件,然後就可以在vue例項...