動態規劃 ACM興趣小組輔導

2021-06-16 05:39:02 字數 1687 閱讀 7811

一、矩陣連乘問題

1.兩個矩陣乘積所需的計算量

void matrixmultiply(int **a, int **b, int **c, int ra, int ca, int rb, int cb)

if(ca!=rb) return;

for(int i=0; ifor(int j=0; jint sum = a[i][0] * b[0][j];

for(int k=1; ksum += a[i][k] * a[k][j];

c[i][j] = sum;

可見需三重迴圈,總共要ra*ca*cb次數乘。

2.矩陣連乘時,加括號方式影響整個計算量。a1a2a3(10×100, 100×5, 5×50),如(a1a2)a3需要7500次,而a1(a2a3)需要75000次,兩者相差10倍。矩陣連乘問題就是求a1a2...an個矩陣的計算次序使得所需計算量最少,其中矩陣的行列儲存在資料p中,a1為p0×p1,a2為p1×p2。

3.分析

設計算a[i:j],1≤i≤j≤n,所需的最少數乘次數為m[i][j],則顯然原問題的最少數乘次為m[1][n]。

若計算ai...aj時在ak和ak+1之間斷開,則m[i][j]=m[i][k]+m[k+1][j]+pi-1pkpj。因為如果要想整個計算量最少,則ai...ak和ak+1...aj的計算量也必須最少。只要確定的k的位置,則就找到了乙個斷點。k只有i, i+1,...,j-1這幾種可能。m[i][j]可遞迴地定義為:

4.利用遞迴直接計算a[i][j]。(其中s[i][j]儲存的是斷開點)

int recurmatrixcahin(int i, int j)

} }

} 測試資料為:

a1a2 a3

a4 a5

a6 30

´35 35

´15 15

´5 5

´10 10

´20 20

´25

時可見,動態規劃方法相同的子問題只計算一次,效率高。n

2。5.備忘錄方法

int memoizematrixchain(int n, int **m, int **s)

int lookupchain(int i, int j)

以上內容摘自《計算機演算法設計與分析》王曉東。
附:void traceback(int i,int j,int**s)

int k=s[i][j];

if(i !=k)

cout<

if(i !=k)

cout<

if(j !=k+1)

cout<

traceback(k+1,j,s);

if(j !=k+1)

cout<

}

traceback(i,k,s);

藍橋杯 (java)興趣小組

為豐富同學們的業餘文化生活,某高校學生會創辦了3個興趣小組 以下稱a組,b組,c組 每個小組的學生名單分別在 a.txt b.txt 和 c.txt 中。每個檔案中儲存的是學生的學號。由於工作需要,我們現在想知道 既參加了a組,又參加了b組,但是沒有參加c組的同學一共有多少人?請你統計該數字並通過瀏...

LINUX興趣小組面試總結

記著大概是乙個月以前的四月一號,我第一次得知我期盼已久的linux興趣小組開始納新了,那時的我激情滿懷,決定這個月好好學習,為linux面試做準備,接下來的乙個月,我開始寫raysnote,寫了很多linux的命令學習筆記,寫了一篇演算法導論的學習筆記,寫了點資料結構與演算法的學習筆記,日常刷刷題,...

寒假興趣小組作業總結 1 12

思路1 使用輔助棧,每往棧裡面入乙個元素,都往輔助棧裡面加入棧裡面最小的元素,使得每個元素都與相應的最小元素一一對應。當乙個元素要入棧時,把它與輔助棧棧頂的元素作比較,得出最小值,將這個最小值放入輔助棧的棧頂。棧裡的乙個元素要出棧時,對應的輔助棧的元素也要出棧。思路2 用乙個棧實現,每次入棧兩個元素...