dp
题目求的是最长连续递增子序列的长度,dp[i]在这里就表示问题的解,我们定义dp[i]为以i结尾的最长连续递增子序列的长度。
如果说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;
}