Longest sequences by changing one ele
再次重申,算法经常涉及的是递推与递归,而不是公式,典型的DP,我之前写正则那题的时候,总会想着往前扫描前面所有的状态,
其实只需要看前面一个状态就可以了,这点是通过最优子结构性质保证的!
这道题目和LC上用L[] R[]数组的题目一样,都是维护两个数组,然后max(ans, L[i-1]+R[i+1]+1) if(a[i-1]+1<a[i+1])
递推关系也通过模拟出来了,发现找一组数据模拟一下运行是生成算法的利器!
但是一个致命点漏掉了,如果前后元素相差不满足2的话,还是需要更新的,max(ans, L[i-1]+1, R[i+1]+1)这点在第一遍的时候错了!
while(cin>>n)
{
for(int i=0;i<n;i++) cin>>a[i];
l[0]=1;
for(int i=1;i<n;i++)
{
if(a[i]>a[i-1]) l[i]=l[i-1]+1;
else l[i]=1;
}
r[n-1]=1;
for(int i=n-2;i>=0;i--)
{
if(a[i]<a[i+1]) r[i]=r[i+1]+1;
else r[i]=1;
}
int ans=1;
for(int i=0;i<n;i++)
{
if(i-1>=0 && i+1<n)
{
if(a[i-1]+1<a[i+1]) ans=max(ans, l[i-1]+r[i+1]+1);
else
ans=max(ans, max(l[i-1]+1,r[i+1]+1));
}
else if(i-1>=0 && i+1>=n) ans=max(ans, l[i-1]+1);
else if(i+1<n && i-1<0) ans=max(ans, r[i+1]+1);
}
cout<<ans<<endl;
}