线性dp——cf1032
Posted zsben991126
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线性dp——cf1032相关的知识,希望对你有一定的参考价值。
升维来保存第i位按j是否可行,然后枚举i-1个的状态,用5*5n就可以完成递推
/* dp[i][j]==0表示第i步按j不可行 */ #include<bits/stdc++.h> using namespace std; #define maxn 200005 int dp[maxn][6],pre[maxn][6],n,a[maxn]; void print(int i,int pos){ if(i==0)return; print(i-1,pre[i][pos]); cout<<pos<<" "; } int main(){ cin>>n; for(int i=1;i<=n;i++)cin>>a[i]; for(int i=1;i<=5;i++)dp[1][i]=1; for(int i=2;i<=n;i++){ if(a[i]>a[i-1]){ for(int j=2;j<=5;j++) for(int k=1;k<j;k++) if(dp[i-1][k])dp[i][j]=1,pre[i][j]=k; } if(a[i]==a[i-1]){ for(int j=1;j<=5;j++) for(int k=1;k<=5;k++) if(j!=k && dp[i-1][k])dp[i][j]=1,pre[i][j]=k; } if(a[i]<a[i-1]){ for(int j=1;j<=5;j++) for(int k=j+1;k<=5;k++) if(dp[i-1][k])dp[i][j]=1,pre[i][j]=k; } } int pos=0; for(int i=1;i<=5;i++){ if(dp[n][i])pos=i; } if(pos)print(n,pos); else puts("-1"); }
以上是关于线性dp——cf1032的主要内容,如果未能解决你的问题,请参考以下文章