线性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的主要内容,如果未能解决你的问题,请参考以下文章

数论+线性dp——cf1174A

CF1032B Personalized Cup

线性dp,后缀处理——cf1016C好题

cf478d 线性dp好题

[CF1032D] Barcelonian Distance - 计算几何

[CF1032D] Barcelonian Distance - 计算几何