1. 程式人生 > >C - Painting Fence(分治)

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