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;
}

Posted by richard爱闹 - 4月 7 2015
如需转载,请注明: 本文来自 Richard