BZOJ 3427 Bytecomputer

???

首先开头的数不能变,那好,讨论一下

若第一个数为1,之后都要>=1,让它们都为1即可

若第一个数为0,则下一个非零数不能为-1,即必须为1,之后均为1

若第一个数为-1,这个情况比较复杂,让我考虑考虑……

(稍后……)

线粒体膜电位,锑DP,考虑个磷

#include <cstdio>
#include <algorithm>

using std::min;

const int MAXN=1000111;
const int INF=1034567890;

int N;

int A[MAXN];

int F_[MAXN][3], *F[MAXN];

int main(){
    
    for(int i=0;i<MAXN;++i){
        F[i]=&F_[i][1];
        F[i][-1]=F[i][0]=F[i][1]=INF;
    }
    
    scanf("%d", &N);
    
    for(int i=1;i<=N;++i)   scanf("%d", &A[i]);
    
    F[1][A[1]]=0;
    for(int i=1;i<N;++i){
        if(F[i][-1]<INF){
            for(int j=-1;j<=A[i+1];++j)
                F[i+1][j]=min(F[i+1][j], F[i][-1]+A[i+1]-j);
        }
        if(F[i][0]<INF && A[i+1]>=0)    F[i+1][A[i+1]]=min(F[i+1][A[i+1]], F[i][0]);
        if(F[i][1]<INF)
            F[i+1][1]=min(F[i+1][1], F[i][1]+1-A[i+1]);
    }
    
    int Ans=INF;
    for(int j=-1;j<=1;++j)
        Ans=min(Ans, F[N][j]);
    
    if(Ans>=INF)    puts("BRAK");
    else    printf("%d\n", Ans);
    
    return 0;
}

/*
6
-1 1 0 -1 0 1

3

*/

/*
8
-1 1 -1 1 0 0 0 0

3

*/

猜你喜欢

转载自www.cnblogs.com/Pickupwin/p/BZOJ3427.html