题意:
给定n个数,2种操作
第一种操作:横切切到底
第二种操作:竖切切到底
请问最少操作使得n个数为0
解析:
第一种横切得贡献是每次找到最小的然后切去,然后分治递归下去,详细看代码
第二中竖切得贡献是r-l+1;
两者取最小值。
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+100;
int a[N];
int n;
int solve(int l,int r)
{
if(l>r) return 0;
int minn=1e9+7;
int pos=-1;
for(int i=l;i<=r;i++)
{
if(a[i]<minn)
{
minn=a[i];
pos=i;
}
}
for(int i=l;i<=r;i++) a[i]-=minn;
return min(r-l+1,solve(l,pos-1)+solve(pos+1,r)+minn);
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
cout<<solve(1,n)<<endl;
return 0;
}