dp
代码
//这个不是By AcerMo
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int a[1500000];
int dp[1500000][4];//前i个元素,可以得到末尾是j的最少操作数;
int n;
int main()
{
memset(dp,0x3f,sizeof dp);
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
dp[1][a[1]+1]=0;
for(int i=2;i<=n;i++)
{
if(a[i]==-1)
{
dp[i][0]=dp[i-1][0];//不用操作即可完成
//dp[i][1]=min(dp[i][1],dp[i-1][1]+1);//0变到-1
dp[i][2]=min(dp[i][2],dp[i-1][2]+2);//1变到-1要进行两步操作;
}
if(a[i]==0)
{
dp[i][0]=min(dp[i][0],dp[i-1][0]+1);//-1到0要进行1步
dp[i][1]=min(dp[i-1][0],dp[i-1][1]);//0到0不需要
dp[i][2]=min(dp[i][2],dp[i-1][2]+1);//1到0,一步;
}
if(a[i]==1)
{
dp[i][0]=min(dp[i-1][0]+2,dp[i][0]);//-1到1需要两步
dp[i][1]=min(dp[i][1],dp[i-1][0]+1);//0到1需要1步
dp[i][2]=min(min(dp[i-1][0],dp[i-1][1]),dp[i-1][2]);//1到1不需要动;
}
}
int ans=0x3f3f3f3f;
ans=min(min(dp[n][0],dp[n][1]),dp[n][2]);
if(ans==0x3f3f3f3f)
printf("BRAK");
else
printf("%d",ans);
return 0;
}