CF229D Towers


题意是:每次操作能将某个数加到隔壁的数上面,最后求最少操作数,使得序列是非递减序列。
思路:我们发现每次可以将l~r之间的区间合并成一个数,然后需要r-l次操作,我们设定从f[i]为从1处理到i并且序列是递增的最少操作数,然后枚举i是在哪一段区间里,维护l[i](在不影响f[i]最优值的情况下l[i]最小的可能高度)因为小的高度容易让后面接嘛。
代码:

#include<iostream>
#include<cstring>
using namespace std;
const int N=5010;
#define debug() cout<<"---"<<endl;
int h[N];
int n;
int f[N];//考虑前i个塔的最小操作数 
int minv[N];
int s[N];
int main()
{
   
	cin >> n;
	for(int i=1;i<=n;i++)
		cin>>h[i];
	memset(f,0x3f,sizeof f);
	memset(minv,0x3f,sizeof minv);
	for(int i=1;i<=n;i++)
		s[i]=s[i-1]+h[i];
	f[1]=0;
	f[0]=0;
	minv[0]=0;
	minv[1]=h[1];
	for(int i=2;i<=n;i++)
	{
   
		for(int j=1;j<=i;j++)
			if(s[i]-s[j-1]>=minv[j-1] && f[i]>=f[j-1]+(i-j))//将i~j合并
				{
   
					f[i]=f[j-1]+i-j;
					minv[i]=min(minv[i],s[i]-s[j-1]);
				}
	}
	cout<<f[n]<<endl;
	return 0;
}
codeforce 文章被收录于专栏

写写cf的题解啥的

全部评论

相关推荐

找工作勤劳小蜜蜂:自我描述部分太差,完全看不出想从事什么行业什么岗位,也看不出想在哪个地区发展,这样 会让HR很犹豫,从而把你简历否决掉。现在企业都很注重员工稳定性和专注性,特别对于热爱本行业的员工。 你实习的工作又太传统的it开发(老旧),这部分公司已经趋于被淘汰,新兴的互联网服务业,比如物流,电商,新传媒,游戏开发和传统的It开发有天然区别。不是说传统It开发不行,而是就业岗位太少,基本趋于饱和,很多老骨头还能坚持,不需要新血液。 工作区域(比如长三角,珠三角,成渝)等也是HR考虑的因素之一,也是要你有个坚定的决心。否则去几天,人跑了,HR会被用人单位骂死。
点赞 评论 收藏
分享
狄文君:多段项目经历 + 专业技能拉满,这简历很能打,坐等好消息!
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务