【实践报告】算法第三章实践报告

1.实践题目

7-2最大子段和 给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。当所给的整数均为负数时,定义子段和为0。

要求算法的时间复杂度为O(n)。

2.问题描述

输入格式:

输入有两行:

第一行是n值(1<=n<=10000);

第二行是n个整数。

输出格式:

输出最大子段和。

输入样例:

在这里给出一组输入。例如:

6
-2 11 -4 13 -5 -2

输出样例:

在这里给出相应的输出。例如:

20

3.算法描述

经过讨论,我们小组决定采用的是动态规划的解法来解决这一个题目,我们创建了一个数组来存放从初始位置到各位的最大子段和,通过比较最大子段和得出的两种方式,取其大者,并将这个最大子段和与目前的最大子段和比较,记录下最大的,最终得出整段数列的最大子段和。

4.算法时间及空间复杂度分析

时间复杂度:由于代码中没有二重循环,至多只要一重循环,所以这个算法的时间复杂度是O(N)级别的。

空间复杂度:

5.心得体会(对本次实践收获及疑惑进行总结)

对于动态规划类的题目,做法比较明确,但是难点是写出递归表达式,这个十分考验做题者的思维能力,还需要在不断做题才能一步一步提升,不然还是没办法做好这俩算法题。

ps:附上代码

#include<iostream>
using namespace std;
int main(){
int n,maxn;
int a[10005];
int b[10005];
cin>>n;
if(n<0||n>10000)return 0;

for (int i=1;i<=n;i++)
cin>>a[i];
maxn=b[1]=a[1];
for(int j=1;j<=n;j++){
if (maxn<0) maxn=b[j]=0;
b[j+1]=b[j]+a[j+1];
if(b[j+1]<0) {
j++;
b[j+1]=a[j+1];
}
maxn=max(maxn,b[j+1]);
}
cout<<maxn;
return 0;
}

原文地址:https://www.cnblogs.com/lhiscute/p/9940448.html

时间: 2024-10-07 16:46:47

【实践报告】算法第三章实践报告的相关文章

算法第三章实践报告

1.最大子段和. 2.给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],-,a[n],求该序列如a[i]+a[i+1]+-+a[j]的子段和的最大值.当所给的整数均为负数时,定义子段和为0. 要求算法的时间复杂度为O(n). 3. #include<iostream>using namespace std; int maxi(int a[],int n){ int sum,maxsum; int i; sum=maxsum=0; for(i =0;i<n;i++) { s

算法第三章实践

1. 问题: 所以问题的核心是:如何找到最优路径,得到最大的和? 2. 思路:我一开始的思路是,从顶点开始,比较左右两点的大小,然后取最大值的完事了. 然后结果是28. 为什么呢?原来判断到8的时候,会往右走,但是最大值的路径在最左边的,只要往右走了就无法得到最大值. 3. 算法:最后看了网上的博客,看着c++用python打了一遍,(不过是从山脚下开始的,跟oj的热身赛一样). for i in range(num-1, 0, -1): i -= 1 for n in range(i): if

揭露动态规划真面目——算法第三章上机实践报告

算法第三章上机实践报告 一.        实践题目 7-2 最大子段和 (40 分) 给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的子段和的最大值.当所给的整数均为负数时,定义子段和为0. 要求算法的时间复杂度为O(n). 输入格式: 输入有两行: 第一行是n值(1<=n<=10000): 第二行是n个整数. 输出格式: 输出最大子段和. 输入样例: 在这里给出一组输入.例如: 6 -2 11 -4 13 -5

第三章实验报告

第三章实践报告 一.实践题目 给定一个由 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 输出样例:

算法第三章上机实验

算法第三章上机实验 数字三角形 给定一个由 n行数字组成的数字三角形如下图所示.试设计一个算法,计算出从三角形 的顶至底的一条路径(每一步可沿左斜线向下或右斜线向下),使该路径经过的数字总和最大. #include <iostream> using namespace std; int maxsum(int a[100][100],int n){ int b[100][100]={0}; for(int i=n-1;i>=0;i--){ for(int j=i;j>=0;j--){

算法第三章上机实践报告——动态规划

1.实践题目 7-1 数字三角形 (30 分) 给定一个由 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

算法第三章上机实践报告

实践题目 7-1 数字三角形 (30 分) 给定一个由 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

算法第三章上机实践报告之数字三角形

1.实践题目 7-1 数字三角形 (30 分) 给定一个由 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

第三章实践报告

实践题目:数字三角形 题目描述: 设计一个算法,计算出从三角形 的顶至底的一条路径(每一步可沿左斜线向下或右斜线向下),使该路径经过的数字总和最大. 算法描述:从下至上依次左右比较,大的那方和上面的数相加,直至第一列. 算法时间和空间复杂度分析:因为用到了双重循环,所以时间复杂度为o(n^2),同时使用了二维数组,所以空间复杂度也是o(n^2). 心得:这道题用从下至上的方法比较简单,要有逆向思维. 原文地址:https://www.cnblogs.com/ewerin/p/9943461.ht