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; }
没有人不辛苦,只有人不喊疼