算法第三章上机实践报告

算法第三章上机实践报告

1.1 问题描述

设计一个O(n2)时间的算法,找出由n个数组成的序列的最长单调递增子序列。

输入样例:

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

5
1 3 5 2 9

输出样例:

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

4

1.2 算法描述

通过分析题目可得,若想要得到一个最长单调递增子序列,则先定义一个数组dp,dp[i] 表示在第 i 项时前面数字所拥有的最大递增子序列。若想要得到dp[i] 则分为两种情况。第一种情况:dp[i] 大于 dp[i-1....0] 此时,dp[i] 等于dp[i-1]+1;第二种情况:若dp[i] 小于 dp[i-1...0] 此时,dp[i]等于 max(cnt,dp[i-1])。

1.3 问题求解:

代码:

#include <iostream>
using namespace std;

int maxlength(int a[],int n){
	int b[n];
	b[0]=1;
	for(int i=1;i<n;i++){
		int cnt=1;
		for(int j=i-1;j>=0;j--){
			if(a[i]>a[j]){
				cnt=max(cnt,b[j]+1);
			}
		}
		b[i]=cnt;
	}
	int ans=0;
	for(int i=0;i<n;i++){
		ans=max(ans,b[i]);
	}
	return ans;
}
int main(){
	int n;
	cin>>n;
	int arr[n];
	for(int i=0;i<n;i++){
		cin>>arr[i];
	}
	cout<<maxlength(arr,n);
	return 0;
}

1.3.1 递归方程式

递归方程式:dp[i]=max(dp[j])+1,其中0<j<i 且 nums[j]<nums[i]。否则dp[i]=1。

1.3.2 填表

维度:一维数组;

范围:0 - n;

填表顺序:从左到右;

1.3.3 算法时间和空间复杂度

时间复杂度:设置双重循环来对每个数字进行大小比较,因此为O(n²);

空间复杂度:需要一个n的数组,因此空间复杂多为T(n);

2.对动态规划算法的理解和体会

个人理解而言,动态规划依赖于子问题的求解,并且当有重复子问题时,求解会变得更快,子问题不在重复求解使得规模往往从指数将为幂次数。动态规划经常需要数组来解决,并且严格定义好数组的含义很重要,对于填表的顺序等等也是解题的重点,还要注意写出递归式并规定好范围。

posted @ 2021-10-26 22:37  Varié  阅读(31)  评论(0编辑  收藏  举报