算法第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)

三.结对编程感悟

此次实践中,我们对问题有不断地思考和分析,最后得到一致的思路和结果。两人配合的高效率也体现其中。

posted @ 2018-11-05 22:11  陳泽博Czmichael  阅读(169)  评论(0编辑  收藏  举报