C - Painting Fence(分治)

题意:给出宽为1高为Ai的木板n条,排成一排,每次上色只能是连续的横或竖并且宽度为1,问最少刷多少次可以使这些木板都上上色

分析:刷的第一步要么是所有的都竖着涂完,要么是先横着把最矮的涂完,如果是第一种,那么ans等于n,如果是第二种,那么ans=最矮的高度+被刷掉最矮的后,新的几段不连续木板最小上色次数,所以用分治可以解决这个问题

AC代码:

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=1e5+10;
int h[maxn],n;
int paint(int st,int en)
{
    if(st>en)return 0;
    int _min=1e9,c1=0;
    for(int i=st; i<=en; i++)
        _min=min(h[i],_min);
    c1+=_min;
    for(int i=st; i<=en; i++)
        h[i]-=_min;
    int s=st;
    for(int i=st; i<=en; i++)
    {
        if(i==en&&h[i]!=0)
        {
            c1+=paint(s,i),s=i+1;
        }
        else if(h[i]==0)
        {
            c1+=paint(s,i-1),s=i+1;
        }
    }
    return min(en-st+1,c1);
}
int main()
{
    ios::sync_with_stdio(false);
    cin>>n;
    for(int i=1; i<=n; i++)cin>>h[i];
    cout<<paint(1,n)<<endl;
    return 0;
}

  

猜你喜欢

转载自www.cnblogs.com/carcar/p/9948334.html