1. 程式人生 > >算法第3 章上機實踐

算法第3 章上機實踐

動態規劃 img clu problem 導致 bsp listitem ace 分析

1.實踐題目:

7-1 數字三角形 (30 分)

給定一個由 n行數字組成的數字三角形如下圖所示。試設計一個算法,計算出從三角形 的頂至底的一條路徑(每一步可沿左斜線向下或右斜線向下),使該路徑經過的數字總和最大。

技術分享圖片

輸入格式:

輸入有n+1行:

第 1 行是數字三角形的行數 n,1<=n<=100。

接下來 n行是數字三角形各行中的數字。所有數字在0..99 之間。

輸出格式:

輸出最大路徑的值。

輸入樣例:

在這裏給出一組輸入。例如:

5 
7 
3 8 
8 1 0 
2 7 4 4
4 5 2 6 5 

輸出樣例:

在這裏給出相應的輸出。例如:

30

2.問題描述:

計算從數字三角形的頂至底的一條路徑(每一步可沿左斜線向下或右斜線向下),使該路徑經過的數字總和最大。

3.算法描述

分析問題可知,從三角形頂端開始,有兩種選擇:向左走、向右走,而要經過路徑的數字總和最大則取決於第二層所在兩個元素分別組成的數字三角形,一層一層依次類推,因此可以列出遞歸式:

m[i][j]=max(m[i+1][j],m[i+1][j+1])+a[i][j]

接著便可根據遞歸編程

程序為:

#include <iostream>
int n;
int a[1000][1000];
using namespace std;
int triangle( ){
int i,j;
for( i=n-1;i>=1;i--)
for( j=1;j<=i;j++){
if(a[i+1][j]>a[i+1][j+1])
a[i][j]+=a[i+1][j];
else
a[i][j]+=a[i+1][j+1];
}
return a[1][1];
}
int main() {
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++)
cin>>a[i][j];
cout<<triangle()<<endl;
return 0;
}

4.算法時間及空間復雜度分析:

時間復雜度:程序中用了

for( i=n-1;i>=1;i--)

for( j=1;j<=i;j++){ }

因此其時間復雜度為O(n^2) 算法空間復雜度: 由於開辟了新的輔助空間a1000],所以為O(n^2)

5.心得體會

在這題中,雖然很快就有解題思想,但是編程的時候無法輸入正確的結果,後來將i,j輸出後得知i=0,j=2,忽略了for循環中i,j最終值,從而導致輸出錯誤。

在這次實踐中,加深了對動態規劃算法的理解,更熟悉地使用動態規劃算法來解問題。

算法第3 章上機實踐