[POI2013]BAJ-ytecomputer [动态规划]
[POI2013]BAJ-ytecomputer
P3558 [POI2013]BAJ-Bytecomputer
给一个只包含-1,0,1的数列,每次操作可以让a[i]+=a[i-1],求最少操作次数使得序列单调不降
还是很好想的 这样操作下来最后序列里的数也肯定都为-1,0,1
用\(f[i][0/1/2]\)表示数组前\(i\)个数单调不下降时第\(i\)个数为\(-1/0/1\) 然后就分情况转移就是了==
(感觉很简单 它失去了它作为紫题的尊严)
int main(){
#ifndef ONLINE_JUDGE
freopen("T3.txt","r",stdin);
#endif
rd(n);
for(int i=1;i<=n;++i) rd(a[i]);
memset(f,inf,sizeof(f));
f[1][a[1]+1]=0;
for(int i=2;i<=n;++i){
if(a[i]==-1) f[i][0]=f[i-1][0],f[i][2]=f[i-1][2]+2;
else if(!a[i]) f[i][0]=f[i-1][0]+1,f[i][1]=Min(f[i-1][0],f[i-1][1]),f[i][2]=f[i-1][2]+1;
else f[i][0]=f[i-1][0]+2,f[i][1]=f[i-1][0]+1,f[i][2]=Min(f[i-1][2],Min(f[i-1][0],f[i-1][1]));
}
ans=Min(f[n][0],Min(f[n][1],f[n][2]));
if(ans>=inf) puts("BRAK");
else printf("%d",ans);
return 0;
}