算法第三章实践报告

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++)
{
sum+=a[i];
if(sum>maxsum)
maxsum=sum;
else if(sum<0)
sum=0;
}
return maxsum;
}
int main(){
int n;
cin>>n;
int *a=new int [n];
for(int i=0;i<n;i++)
cin>>a[i];
cout<<maxi(a,n);
return 0;
}

4.时间复杂度:1 + n * ( 1 + 1 + 1 * ( 1 + 1 ) ) + 1 = 1 + n + 1 = O(N)

空间复杂度:1 + 1 + 1 + 1 = O(1)

5.对于时间复杂度,由于本次使用动态规划算法,为最小的O(n)。若采用分治法则需O(logn)。而采用二分法等其他方法,时间复杂度会大大增加。

原文地址:https://www.cnblogs.com/Evity/p/9911544.html

时间: 2024-11-03 23:56:44

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

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

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 输出样例: 在这里给出相应的输出.

第三章实践报告

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

算法第4章实践报告

1.实践题目 7-3 程序存储问题 (90 分) 2.问题描述 设有n 个程序{1,2,-, n }要存放在长度为L的磁带上.程序i存放在磁带上的长度是 li,1≤i≤n. 程序存储问题要求确定这n 个程序在磁带上的一个存储方案, 使得能够在磁带上存储尽可能多的程序. 对于给定的n个程序存放在磁带上的长度,计算磁带上最多可以存储的程序数. 输入格式: 第一行是2 个正整数,分别表示文件个数n和磁带的长度L.接下来的1行中,有n个正整数,表示程序存放在磁带上的长度. 输出格式: 输出最多可以存储的

算法第四章实践报告

1.选择第二题进行分析. 给定n位正整数a,去掉其中任意k≤n 个数字后,剩下的数字按原次序排列组成一个新 的正整数.对于给定的n位正整数a和正整数 k,设计一个算法找出剩下数字组成的新数最 小的删数方案. 输入 178543 4 输出132.问题描述:就是删掉指定数字中的一些数字,然后重新组成一个新的数使得这个数达到最小.3.算法描述:这个问题第一眼看下去容易想到对数组不停的排序然后不断删掉最大的,但是按着这个思路去做却发现,不断提取整型数组然后排序会比较复杂,因为要不断求余数等等,而且代码不

算法第五章实践报告

1. 实践题目 工作分配问题 2. 问题描述 设有n件工作分配给n个人.将工作i分配给第j个人所需的费用为cij . 设计一个算法,对于给定的工作费用,为每一个人都分配1 件不同的工作,并使总费用达到最小. 输入格式: 输入数据的第一行有1 个正整数n (1≤n≤20).接下来的n行,每行n个数,表示工作费用. 输出格式: 将计算出的最小总费用输出到屏幕. 输入样例: 在这里给出一组输入.例如: 3 10 2 3 2 3 4 3 4 5 输出样例: 在这里给出相应的输出.例如:   9 3. 算

算法第三章实践

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

第三章实验报告

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

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

算法第三章上机实践报告 一.        实践题目 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行数字组成的数字三角形如下图所示.试设计一个算法,计算出从三角形 的顶至底的一条路径(每一步可沿左斜线向下或右斜线向下),使该路径经过的数字总和最大. #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--){