码迷,mamicode.com
首页 > 其他好文 > 详细

cf 448 C. Painting Fence

时间:2019-01-22 00:32:51      阅读:211      评论:0      收藏:0      [点我收藏+]

标签:min   区间   can   span   paint   最小值   bit   namespace   return   

分治,对于每个子区间都有两种情况,一种是全都竖着刷,第二种是把最小值以下横着刷,上面的部分被分成好多段,再一直递归下去

#include<bits/stdc++.h>
using namespace std;
int h[5010];
const int INF=1e9+7;
int cal(int l,int r)
{
    if(l>r)
      return 0;
    int minn=INF;
    for(int i=l;i<=r;i++)
       minn=min(h[i],minn);
    for(int i=1;i<=r;i++)
       h[i]-=minn;
    int now=minn;
    int s=l;
    for(int i=l;i<=r;i++)
    {
        if(i==r&&h[i]>0)//注意这里要加特判,最后一位必须大于0,否则可能一直递归下去 
        {
            now+=cal(s,i);
        }
        else if(h[i]==0)
        {
            now+=cal(s,i-1),s=i+1;
        }
    }
    return min(r-l+1,now);
}
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
       scanf("%d",&h[i]);
    printf("%d\n",cal(1,n));
}

 

cf 448 C. Painting Fence

标签:min   区间   can   span   paint   最小值   bit   namespace   return   

原文地址:https://www.cnblogs.com/lishengkangshidatiancai/p/10301597.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!