[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; }