零崎有很多朋友,其中有乙個叫jhljx。
jhljx大家很熟悉了,他數學不好也是出了名的,大家都懂。
現在jhljx遇到了矩陣乘法,他當時就懵了。數都數不清的他,矩陣乘法怎麼可能會算的清楚呢?雖然零崎覺得還不如讓你們來算,不過好歹也要給jhljx個面子,給她留下乙個證明自己數學實力的機會。為了減小jhljx的計算量,讓他趕快算出不正確答案來(估計他算上幾遍都不一定能出乙個正確答案),零崎請你們幫助jhljx。
多組輸入資料。
每組資料以n開始,表示矩陣鏈的長度。接下來一行n+1個數表示矩陣的行/列數。
1<=n<=300
對於每組樣例,輸出一行最少運算次數的方案,每兩個矩陣相乘都用「()」括起來,詳見樣例
如果存在多種解決方案,最終輸出結果選取先計算左邊的矩陣,詳見hint
3 10 30 5 60
3 10 20 5 4
((a1a2)a3)
((a1a2)a3)
對於輸入的第二組資料,
如果計算順序為((a1a2)a3),結果為10×20×5 + 10×5×4= 1200,
如果計算順序為a1(a2a3), 結果為20×5×4 + 10×20×4 = 1200
那麼輸出結果選取第乙個
弄懂這三點,這個問題就迎刃而解了:
(1) 矩陣鏈a1,a2,…,an相乘的演算法,狀態轉移方程:
m[i][j] = min ;
(2) 如果存在多種解決方案,最終輸出結果選取先計算左邊的矩陣:
**中的這一句:「m[i][j] >= temp」,「=」不能少。
(3) 列印出最少相乘次數對應的結果。這就要求我們必須使用乙個陣列divpos儲存分點位置(divpos[i][j]表示ai~aj之間的分點位置)。然後再根據記錄的分點,使用遞迴進行列印。
遞迴偽**:
printresult(int left, int right)
if(left == right)
print aleft;
else
print「(」;
printfresult(left, divpos[left][right]);
printresult(divpos[left][right]+1, right);
print 「)」;
#include
#include
#include
#include
#define inf 0xffffff;
using
namespace
std;
int divpos[505][505];
int p[505];
int m[505][505];
void printresult(int i, int j)
}int main()}}
printresult(1, n);
printf("\n");
}}
100 零崎的朋友很多
時間限制 2000 ms 記憶體限制 65536 kb 總通過人數 233 總提交人數 247 零崎有很多朋友,其中有乙個叫做lfj的接盤俠。lfj是乙個手殘,他和零崎一起玩網遊的時候不好好打本,天天看拍賣行,沒過多久,就成為了乙個出色的商人。時間一長,雖然掙了不少錢,卻沒時間練級了。作為lfj的友...
G 零崎的朋友很多 (0 1揹包修改版 )
零崎有很多朋友,其中有乙個叫做lfj的接盤俠。lfj是乙個手殘,他和零崎一起玩網遊的時候不好好打本,天天看拍賣行,沒過多久,就成為了乙個出色的商人。不過再出色的投機商也有失手成為接盤俠的一天。所謂真正的接盤俠從來不給自己留活路。當lfj接盤成功之時,即分文不剩之日。作為lfj的友人,零崎實在看不下去...
零崎的悠哉日常
零崎閒下來的時候很喜歡去看書,特別是在沙河的時候,經常和社團的小夥伴一起去自習室看 教學樓跑的次數多了,自然對路也比較熟,比如教三大教室旁邊的樓梯間裡或者教學樓連通走廊的製圖教室外經常有妹子讀英語什麼的 說起來教室之間有各種各樣不同的路可以走,不同的路的容納量也不同,那麼這麼多教室這麼多路,如果從一...