题意:我是一个粉刷匠,咿呀咿呀哟。有n块宽度都为1,高度各不相同的栅栏围城一行,粉刷匠有个宽度为1的刷子,他可以横着刷,竖着刷,不可以斜着刷哟。当然刷到尽头就停止。问最少刷多少次能刷满,可以重叠刷。
题解:刚开始本来想用着DP的,后来试了N久还是wrong了。弃疗。后来在网上发现一个新的思路。无脑切切切。先切腿切齐之后分块继续往上切。分区操作。就可以了。
#include <bits/stdc++.h>
using namespace std;
int a[5010];
int n;
int gogogo(int l,int r)
{
int len=r-l+1;
int max=a[l],ans=0;
for (int i=l;i<=r;i++)
if (a[i]<max)
max=a[i];
for (int i=l;i<=r;i++)
a[i]-=max;
ans=max;
for (int i=l;i<=r;i++)
{
if (a[i]!=0)
{
int l1=i,r1=i+1;
while (a[r1]!=0 && r1<=r)
r1++;
r1--;
ans+=gogogo(l1,r1);
}
}
if (len<ans)
ans=len;
return ans;
}
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
scanf("%d",&a[i]);
cout<<gogogo(1,n)<<endl;
return 0;
}