线性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");
} 

猜你喜欢

转载自www.cnblogs.com/zsben991126/p/10807019.html