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

猜你喜欢

转载自www.cnblogs.com/lxyyyy/p/11679732.html
今日推荐