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

*/

posted @ 2019-03-09 22:16  Pickupwin  阅读(110)  评论(0编辑  收藏  举报