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

演算法第3 章上機實踐

1.實踐題目:

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

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

QQ截圖20170929023616.jpg

輸入格式:

輸入有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最終值,從而導致輸出錯誤。

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