升维来保存第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"); }