CodeForces - 933A A Twisty Movement(dp)
生活随笔
收集整理的這篇文章主要介紹了
CodeForces - 933A A Twisty Movement(dp)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接:點擊查看
題目大意:給出一個長度為 n 的數列,只由 1 和 2 組成,現在允許反轉一段區間,問反轉后的不下降子序列最長是多少
題目分析:因為 n 只有 2000,所以考慮n2n^2n2去枚舉所有的子區間進行反轉然后維護答案,不過我們需要預處理出兩個dp數組備用:
在枚舉子區間 [ l , r ] 時,整個數組很自然的被分成了三段:
再枚舉一下上面六個端點相應的取值,直接轉移就好了
代碼:
// #pragma GCC optimize(2) // #pragma GCC optimize("Ofast","inline","-ffast-math") // #pragma GCC target("avx,sse2,sse3,sse4,mmx") #include<iostream> #include<cstdio> #include<string> #include<ctime> #include<cmath> #include<cstring> #include<algorithm> #include<stack> #include<climits> #include<queue> #include<map> #include<set> #include<sstream> #include<cassert> #include<bitset> #include<unordered_map> using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=2100;int a[N];int dp1[N][N][2][2];//dp[l][r][st][ed]:區間[l,r]內,起點為st,終點為ed的最長不下降int dp2[N][N][2][2];//倒著的答案int main() { #ifndef ONLINE_JUDGE // freopen("data.in.txt","r",stdin); // freopen("data.out.txt","w",stdout); #endif // ios::sync_with_stdio(false);int n;scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",a+i);a[i]--;}for(int i=1;i<=n;i++)//枚舉起點for(int j=i;j<=n;j++){for(int st=0;st<=1;st++)//不選a[j]for(int ed=st;ed<=1;ed++)dp1[i][j][st][ed]=dp1[i][j-1][st][ed];for(int st=0;st<=1;st++)//選a[j]for(int ed=st;ed<=a[j];ed++)dp1[i][j][st][a[j]]=max(dp1[i][j][st][a[j]],dp1[i][j-1][st][ed]+1);}for(int j=n;j>=1;j--)//枚舉終點for(int i=j;i>=1;i--){for(int st=0;st<=1;st++)//不選a[i]for(int ed=st;ed<=1;ed++)dp2[i][j][st][ed]=dp2[i+1][j][st][ed];for(int st=0;st<=1;st++)for(int ed=st;ed<=a[i];ed++)dp2[i][j][st][a[i]]=max(dp2[i][j][st][a[i]],dp2[i+1][j][st][ed]+1);}int ans=0;for(int st=0;st<=1;st++)for(int ed=st;ed<=1;ed++)ans=max(ans,dp1[1][n][st][ed]);for(int l=1;l<=n;l++)for(int r=l;r<=n;r++){for(int a=0;a<=1;a++)for(int b=a;b<=1;b++)for(int c=b;c<=1;c++)for(int d=c;d<=1;d++)for(int e=d;e<=1;e++)for(int f=e;f<=1;f++)ans=max(ans,dp1[1][l-1][a][b]+dp2[l][r][c][d]+dp1[r+1][n][e][f]);}printf("%d\n",ans);return 0; }總結
以上是生活随笔為你收集整理的CodeForces - 933A A Twisty Movement(dp)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2020ICPC(上海) - Walke
- 下一篇: CodeForces - 1102F E