给定一个由 n行数字组成的数字三角形如下图所示。试设计一个算法,计算出从三角形 的顶至底的一条路径(每一步可沿左斜线向下或右斜线向下),使该路径经过的数字总和最大。
3.算法描述
代码如下:
#include <iostream>
using namespace std;
int max(int a,int b){
return a>b?a:b;
}
int arr[101][101];
int main(){
int n;
cin>>n;
for(int r = 0;r < n; r++){ //输入让其成为一个直角三角形,每一步要不向下走,要不向右下走
for(int c = 0; c <= r ; c++){
cin>>arr[r][c];
}
}
//arr[i][j] 代表那一行那一列的那个值
for(int i = n-2 ; i >= 0; i--){ //从倒数第二行开始
for(int w = 0; w <= i+1 ; w++){ //每次都从第一列开始
arr[i][w] += max(arr[i+1][w],arr[i+1][w+1]); //计算每一次走是向下走的还是向右下走加起来的值大,取代原来的值
}
}
cout<<arr[0][0];
return 0;
}
4.算法时间及空间复杂度分析
算法时间: 算法有两个for循环,因而时间复杂度为:O(n^2)
空间复杂度: 由于开辟了新的辅助空间——数组arr[101][101],故空间复杂度为O(n^2)
5.心得体会
在写代码之前,要尽可能地去分析问题,按照动态规划的思想,化大为小(有联系),明确一步内有多少个可能性的操作,写出递归方程。建立数组时,如一个二维数组a【i】【j】,i,j可以代表什么意义,如从i---》j的序列,又或如i,j代表两个不同的序列的意思,i代表以i结尾的第一个序列,j代表以j结尾的第二个序列。