一个序列A, 每次可以 相邻的数相加为一个数字,求最少次数使得序列非降

 

 f[i ]= min{  f [ j ] + i-j-1 }  ,s[i]-s[j] >= s[j] -s[mn[j-1] ]

  维护下前缀最小值mn[ i]

#include <iostream>
#include <queue>
#include <cstring>

using namespace std;
 const int N =5002;
 
 int n,a[N],f[N],s[N],mn[N];
 
 signed main(){
 	int i,j;
 	cin>>n;
 	memset(f,127,sizeof f);
 	memset(mn,127,sizeof mn);
 	for(i=1;i<=n;i++)
 		cin>>a[i],s[i]=s[i-1]+a[i];
 	
 	f[0]=mn[0]=0;
 	for(i=1;i<=n;i++)
 	 for(j=0;j<i;j++){
 	 	if(mn[j]<=s[i]-s[j]){
 	 		mn[i]=min(mn[i],s[i]-s[j]);
 	 		f[i]=min(f[i],f[j]+i-j-1);
 	 	}
 	 }	
 	 cout<<f[n]<<endl;
 }	

 

posted on 2023-03-25 22:41  towboat  阅读(20)  评论(0)    收藏  举报