C - Painting Fence(分治)
阿新 • • 發佈:2018-11-12
題意:給出寬為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; }