针对PTA上算法第三章实践中的第一题进行分析ios
实践题目:算法
算法第三章上机实践报告编程
问题描述:数组


算法分析:函数
#include<iostream>
#include<cmath>
using namespace std;
int main(){
int n;
cin>>n;
int a[101][101];
int sum[101][101];
for(int i=1;i<=n;i++){
for(int j=1;j<=i;j++){
cin>>a[i][j];
}
}
for(int i=1;i<=n;i++){
sum[n][i] = a[n][i];
}
for(int i=n;i>0;i--){
for(int j=1;j<=i;j++){
if(sum[i][j]>=sum[i][j+1]){
sum[i-1][j] = a[i-1][j] + sum[i][j];
}
else{
sum[i-1][j] = a[i-1][j] + sum[i][j+1];
}
}
}
cout<<sum[1][1];
}
时间、空间复杂度分析:
时间复杂度为O(n^2),由于排序时所用的是二重循环,故而时间复杂度为O(n^2)。spa
空间复杂度为O(1),由于在主函数中给变量分配的空间是常数,因此空间复杂度为O(1)。blog
心得体会:排序
先分析了一会题目,打算采用从下至上,定义另外一个二维数组,先将三角形最底层的各数值存进数组的第n行,而后经过两两比较,大的一方与上一行的数值相加后存进上一行的一维数组中,不断循环下去,第一行的数值sum[1][1]即为最大路径的值。ci
略有欠缺的是在二维数组循环的时候,最早是由i=0开始的,致使后面有些判断、将最后一行的数值复制都出现了小小的错误,于是无法得出正确答案。后来不断修改,才知道从i=1更容易理解和编程。io
挺喜欢上机打题和结对编程的,能够不断交流,不断发现还有哪些地方不足,而后一步一步修改,直到算法最优,提交成功。