小苯的最大和

题目链接:https://ac.nowcoder.com/acm/contest/105623/D

题意:

给定一个数组,可以连续删掉两个或连续删掉三个,经过任意次操作求数组最大和

思路:

贪心的思路不正确
至于为什么我也不到啊
以下是ai给出的解释:
1.删除两个相邻的数字和删除三个连续的数字是两种不同的操作,且它们之间存在相互影响。贪心算法在处理这些操作时,无法全面考虑所有可能的组合和顺序,因此可能导致次优解。
2.贪心算法可能会优先删除当前看起来对总和贡献最小的部分(例如,删除负数最多的子数组),但这可能会影响后续操作的选择。比如,如果贪心地删除了一个负数较多的子数组,可能会错过更好的删除方式。
3.由于每次删除操作会改变数组的结构,后续的操作需要基于新的数组重新计算。这种动态变化使得贪心算法难以捕捉全局最优解。

总之使用一维dp解决这道题
记dp[i]为以i位置为结尾能达到的数组最大和
对于i位置有两种选择:
1.不删除:那么dp[i]=dp[i-1]+a[i]
2.删除:如果连删两个(i,i-1):dp[i]=dp[i-2]
如果连删三个(i,i-1,i-2)dp[i]=dp[i-3]
取max

初始化方面dp[0]=0(一开始无元素则数组和为0)
另外其他的都要初始化为-inf,因为有可能数组是全负的而且长度为1,这样因为麦乐鸡定理就删除不了了(两个数p,q不能表示的最小整数:p x q - (p+q) )

void solve(){
	int n;cin>>n;
	vector<int>a(n+7);
	for(int i=1;i<=n;i++)cin>>a[i];
	vector<int>f(n+7,-inf);
	f[0]=0;
	for(int i=1;i<=n;i++){
		f[i]=max(f[i-1]+a[i],f[i]);
		if(i-2>=0)f[i]=max(f[i],f[i-2]);
		if(i-3>=0)f[i]=max(f[i],f[i-3]);
	}
	
	cout<<f[n]<<endl;
}
posted @ 2025-03-31 16:36  Marinaco  阅读(39)  评论(0)    收藏  举报
//雪花飘落效果