算法第3章上机实践报告
一.
7-1 数字三角形 (30 分)
给定一个由 n行数字组成的数字三角形如下图所示。试设计一个算法,计算出从三角形 的顶至底的一条路径(每一步可沿左斜线向下或右斜线向下),使该路径经过的数字总和最大。
算法思想:通a[i][j]来表示该位置的最长路径,自底向上的计算比较,最后返回a[0][0],即整个数组的最大路径
代码实现:
#include<stdio.h>
#include<string.h>
int a[150][150];
int fun(int b[][150],int n,int i,int j){
if(i==n-1) return b[i][j];
if(a[i][j]>=0)return a[i][j];
if( b[i][j]+fun(b,n,i+1,j)>b[i][j]+fun(b,n,i+1,j+1))
return a[i][j]=b[i][j]+fun(b,n,i+1,j);
else return a[i][j]=b[i][j]+fun(b,n,i+1,j+1);
}
int main(){
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
memset(a,-1,sizeof(a));
int n;
int b[150][150];
int i,j;
scanf("%d",&n);
for(i=0;i<n;i++)
for(j=0;j<i+1;j++)
scanf("%d",&b[i][j]);
printf("%d",fun(b,n,0,0));
return 0;
}
时间复杂度o(n*n)
二.
7-2 最大子段和 (40 分)
给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。当所给的整数均为负数时,定义子段和为0。
要求算法的时间复杂度为O(n)。
算法分析:通过b接收a当前位置的最大字段和,最后返回sum
代码实现:
#include <iostream>
using namespace std;
int MaxSum(int n,int a[])
{
int sum=0,b=0;
for(int i=1;i<=n;i++)
{
if(b>0) b+=a[i];
else b=a[i];
if(b>sum) sum=b;
}
return sum;
}
int main()
{
int n,a[10001];
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
cout<<MaxSum(n,a);
return 0;
}
时间复杂度o(n),空间复杂度(n)
三.结对编程感悟
此次实践中,我们对问题有不断地思考和分析,最后得到一致的思路和结果。两人配合的高效率也体现其中。
浙公网安备 33010602011771号