CF1272D Remove One Element题解

   本题求取最长连续子串,最多可以删除一位。

   这题是典型的dp状态机模型,我们需要两维数组,第二维表示是否之前已经删除过一位。整体f[i][0],f[i][1]表示以第i个数字结尾的最大值

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<functional>
#include<string>
#include<algorithm>
#include<iostream>
#include<set>
#include<vector>
#include<queue>
#include<cstdlib>
using namespace std;
const int N=2e5+10;
int f[N][2]; //第二维表示有没有已经间隔了1 
int a[N];
int main(){
    int i;
    int n;
    cin>>n;
    for(i=1;i<=n;i++)
    cin>>a[i];
    f[1][0]=1;
    for(i=2;i<=n;i++){
        f[i][0]=1; //初始状态为1 
        if(a[i]>a[i-1]){
        f[i][0]=f[i-1][0]+1;//当它的前面一个元素大的时候,可以取i-1位置没有间隔过的+1 
        f[i][1]=f[i-1][1]+1;//表示 可以去i-1位置已经间隔过的+1和他本身哪个大 
        }
        if(a[i]>a[i-2])
        f[i][1]=max(f[i-2][0]+1,f[i][1]);//当他大于i-2,可以用i-2位置没有间隔过的+1或者他本身 
    }
    int res=0;
    for(i=1;i<=n;i++)
    res=max(res,max(f[i][0],f[i][1]));
    cout<<res<<endl;
}
View Code
posted @ 2019-12-13 09:23  朝暮不思  阅读(236)  评论(0编辑  收藏  举报