标签:题目 ges 接下来 using 报告 组成 时间 cout 二维数组
1、实践题目:
7-1 数字三角形
给定一个由 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、算法描述
易知该问题应使用动态规划的方法,存在重叠子问题。
首先思考递归方程以及如何记录最大数字总和:
然后思考如何用代码实现:
#include<iostream> using namespace std; int Max(int a, int b){ return (a > b) ? a : b; } int main(){ int a[101][101]; int m[101][101]; int n; cin >> n; int max; for(int i=0; i<n; i++){ for(int j=0; j<=i; j++){ cin >> a[i][j]; } } for(int j=0; j<n; j++){ m[n-1][j] = a[n-1][j]; } for(int i=n-2; i>=0; i--){ for(int j=0; j<n; j++){ m[i][j] = Max(m[i+1][j], m[i+1][j+1]) + a[i][j]; } } max = m[0][0]; cout << max; return 0; }
4、算法时间及空间复杂度分析(要有分析过程)
时间复杂度:初始化数组使用for循环嵌套,时间复杂度为O(n2),填表也使用了for循环嵌套,时间复杂度为O(n2),所以整个算法的时间复杂度为O(n2)。
空间复杂度:因为需要用到辅助空间二维数组进行填表,所以空间复杂度是O(n2)。
5、心得体会(对本次实践收获及疑惑进行总结)
标签:题目 ges 接下来 using 报告 组成 时间 cout 二维数组
原文地址:https://www.cnblogs.com/WWYlaowu/p/11706376.html