???
首先开头的数不能变,那好,讨论一下
若第一个数为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
", Ans);
return 0;
}
/*
6
-1 1 0 -1 0 1
3
*/
/*
8
-1 1 -1 1 0 0 0 0
3
*/