[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; 
}
posted @ 2019-10-16 11:36  委屈的咸鱼鱼鱼鱼  阅读(153)  评论(0编辑  收藏  举报