算法第三章上机实践报告
算法第三章上机实践报告
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.对动态规划算法的理解和体会
个人理解而言,动态规划依赖于子问题的求解,并且当有重复子问题时,求解会变得更快,子问题不在重复求解使得规模往往从指数将为幂次数。动态规划经常需要数组来解决,并且严格定义好数组的含义很重要,对于填表的顺序等等也是解题的重点,还要注意写出递归式并规定好范围。