#include <bits/stdc++.h>
using namespace std;
using VI = vector<int>;
using PII = pair<int,int>;
using ll = long long;
using ull = unsigned long long;
int n;
int a[1000010];
int dp[1000010][5];
int main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
memset(dp,0x3f,sizeof dp);
dp[1][a[1]+2] = 0;
for(int i=2;i<=n;i++){
for(int j=3;j>=1;j--){
int d = j - 2 - a[i];
for(int k=j;k>=1;k--){
if(d == 0){
dp[i][j] = min(dp[i][j],dp[i-1][k]);
}
if( d * (k-2) > 0){
dp[i][j] = min(dp[i][j] , dp[i-1][k] + d * (k-2));
}
}
//cout<<i<<" "<<j-2<<" "<<dp[i][j] << endl;
}
}
int res = 0x3f3f3f3f;
for(int i=1;i<=3;i++) res = min(res,dp[n][i]);
if(res >= 0x3f3f3f3f) cout<<"BRAK";
else cout<<res;
}
前i位置,末尾数字是j的最小操作数
dp[i][j] = min (dp[i-1][k] + 操作数) k <= j
关于这个操作数就有说法了,
如果j == a[i] 那么op = 0; 反之也成立
a[i] + op * k = j ---> op * k = j - a[i]
当 k = 0 很明显只能转移 j == a[i] 也就是上一种情况
当 k != 0 op = (j-a[i]) * k > 0
于是就算出了操作数,当然这其实还是挺麻烦的,
其实枚举一下 -1 1 0 也不失为一个好办法