题意:给出宽为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; }