第三章实践报告

实践题目:数字三角形

问题描述:给定一个由 n行数字组成的数字三角形如下图所示。试设计一个算法,计算出从三角形 的顶至底的一条路径(每一步可沿左斜线向下或右斜线向下),使该路径经过的数字总和最大。

 算法描述:本题可通过动态规划,将每一条路线的最优解保存在表格中,一步步由底至上找到最优。首先应该画出数字三角形,然后最底的两个数分别与结点数相加,将大的数替换结点数(或者可以用填表的方式将这个数字保存下来),然后再通过for循环(或者使用递归方式),由底至上,一步步将最大的和替换(保存)下来,直至第一个数。

由于简单理解,我和组员吴梓轩采用了for循环的方法。具体算法如下:

#include<iostream>
using namespace std;
int sanjiaoxing(int &a,int &b){
return(a>b?a:b);
}
int main(){
int a[100][100];
int line;
cin>>line;
for(int i = 0;i < line;i++){
for(int j = 0;j <= i;j++){
cin>>a[i][j];
}
}
for(int i = line - 1;i >= 0;i--){
for(int j = i;j >= 0;j--){
int n,m;
n = a[i][j] + a[i-1][j-1];
m = a[i][j-1] + a[i-1][j-1];
a[i-1][j-1] = sanjiaoxing(n,m);
}
}
cout<<a[0][0]<<endl;
return 0;
}

由于算法中有两个for循环,所以算法的时间复杂度应该为O(n2)。

心得体会:

动态规划的思想还是很有难度,十分不好掌握,要找到递归的方法,自顶向下或自底向上找到问题的最优解。由于这道实践的题目难度不算特别大,所以在课堂能做出来,但面对后面的实践题,自己觉得还是有非常大的进步空间的。

posted on 2018-11-04 20:22  李鉴涛  阅读(128)  评论(0编辑  收藏  举报

导航