蓝桥杯 连续最长递增子序列 解法:dp,模拟,双指针

59 阅读1分钟

0最长递增 - 蓝桥云课 (lanqiao.cn)

dp

题目求的是最长连续递增子序列的长度,dp[i]在这里就表示问题的解,我们定义dp[i]为以i结尾的最长连续递增子序列的长度。

image.png

如果说dp[i]>dp[i-1],那么说明以num[i]的和num[i-1]构成递增关系,那么dp[i]=dp[i-1]+1,否则说明dp[i]的长度小于dp[i-1],那么就说明num[i]和num[i-1]不是连续的递增子序列,那么dp[i]就从1开始,重新往后生成递增子序列。

最后我们要输出所有dp[i]中最长的,样例所示就是dp[6]最长。

#include<bits/stdc++.h>
using namespace std;
int num[1010];
int dp[1010];
int main()
{
	int n; cin >> n;
	for (int i = 0; i < n; i++)cin >> num[i];
        
        //以0下标结尾的长度肯定为1
	dp[0] = 1;
	for (int i = 1; i < n; i++)
	{
		if (num[i] > num[i - 1])dp[i] = dp[i - 1] + 1;
		else dp[i] = 1;
	}

	int Max = 0;
	for (int i = 0; i < n; i++)
	{
		Max = max(Max, dp[i]);
	}

	cout << Max << endl;
	return 0;
}

模拟

题目怎么说就怎么做

#include<bits/stdc++.h>
using namespace std;
int n;
const int N=1010;
int num[N];
int main ()
{
   cin>>n;
   for(int i=0;i<n;i++)
   {
     cin>>num[i];
   }

   int maxlen=0,len=1;
   for(int i=0;i<n;i++)
   {
     if(num[i+1]>num[i])
     {
       len++;
       maxlen=max(maxlen,len);
     }
     else len=1;
   }

   cout<<maxlen;
  return 0;
}

双指针


#include <bits/stdc++.h>
using namespace std;
int main()
{
	// 请在此输入您的代码
	int n;
	cin >> n;
	int a[10005];
	for (int i = 0; i < n; i++) cin >> a[i];
	int j = 0, maxium = 0, length = 1;
	for (int i = 1; i < n; i++) {
		if (a[i] > a[j]) {
			j++;
			length++;
			if (length > maxium) maxium = length;
		}
		else {
			j = i;
			length = 1;
		}
	}
	cout << maxium;
	return 0;
}