题目链接
异常简单的一道题,但是过题异常的不顺利。被恶心到了。
从一开始的纯dp(dp[i][j],为到第i位修改j位,的最大长度)。结果发现非常的不好转移,究其原因,我们修改时,可以修改最后一位,这样就是当前位和后一位的大小关系无法确定,,,。最后想到是先跑一边最大长度,然后看相邻的两个可比可以接上。
下面是ac代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
#include <cmath>
#include <algorithm>
#include <queue>
#include <map>
#include <cstdlib>
#define ll long long
using namespace std;
const int N = 1e5+5;
int su[N], dp1[N], dp2[N];
int main()
{
int n;
scanf("%d", &n);
int ans = 0;
for (int i = 1; i <= n; i++)
{
scanf("%d", &su[i]);
if (su[i] > su[i-1]) dp1[i] = dp1[i-1]+1;
else dp1[i] = 1;
ans = max(ans, dp1[i]);
}
for (int i = n; i >= 1; i--)
{
if (su[i] < su[i+1]) dp2[i] = dp2[i+1]+1;
else dp2[i] = 1;
}
// for (int i = 1; i <= n; i++)
// {
// cout << dp1[i] << " " << dp2[i] << " " << su[i] << endl;
// }
for (int i = 2; i <= n; i++)
{
if (su[i] <= su[i-1])
{
if (dp2[i] == 1) ans = max(ans, dp1[i-1] + 1);
else if (dp1[i-1] == 1) ans = max(ans, dp2[i] +1);
else
{
if (su[i+1] >= su[i-1]+2) ans = max(ans, dp1[i-1] + dp2[i]);
else if (su[i] >= su[i-2]+2) ans = max(ans, dp1[i-1] + dp2[i]);
else ans = max(ans, max(dp1[i-1]+1, dp2[i]+1));
}
}
}
printf("%d\n", ans);
return 0;
}