题目大意 给出n个数,可以合并相邻两个代价为1,求最小代价使得数列单调递增
DP
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 5000+10;
int f[maxn],g[maxn],sum[maxn];
int i,j,h,n;
int main()
{
cin>>n;
for (int i = 1;i<=n;++i)
{
cin>>h;
sum[i]=sum[i-1]+h;
}
f[0]=g[0]=0;
for (int i =1;i <=n;++i)
{
f[i]=i-1; g[i]=sum[i];
for (int j = 0;j<i;++j)
if ((f[j]+i-j-1<f[i] || f[j]+i-j-1==f[i] && sum[i]-sum[j] < g[i])
&& g[j]<=sum[i]-sum[j])
{
g[i] = sum[i] - sum[j];
f[i] = f[j]+i-j-1;
}
}
cout << f[n] << endl;
return 0;
}