普及组知识2——贪心

image
image

本鸽子对贪心的理解其实也并不算深

用的相对少,而且也不咋列式子(不要学我)

但是还是很重要(超大声)

今年S的T1想了2.5年,用优先队列AC了(什么鬼)

用来优化的贪心较多(毕竟只是思路)

image

#include<bits/stdc++.h>
using namespace std;
int n,t;
int maxn = INT_MIN;
int main()
{
	cin>>t;
	for(int x = 1;x <= t;x++)
	{
		maxn = 0;
		cin>>n;
		int a[n+5] = {0},dp[n+5] = {0};
		for(int i = 1;i <= n;i++)
			cin>>a[i];
		for(int i = 1;i <= n;i++)
        {
            dp[i] = a[i];
            for(int j = i-2;j > 0;j--)
            {
                dp[i] = max(dp[i],dp[j]+a[i]);
            }
        }
			 
		for(int i = 1;i <= n;i++)
			maxn = max(maxn,dp[i]);
		cout<<maxn<<'\n';
	}
	return 0;
}

没关系,n²只有1e10(TLE10pts)

那怎么办?

线段树!!! 必须贪心呀

首先,DP设计肯定不能再优了(只剩一维了)

那就只能从转移入手了

由于题面上说现金都是正整数,那么我们如果可以不影响其他选择,则能多选就多选

如果我们选了 A_5 ,我们就不会只选 A_1 ,因为 A_ 3 可以白选

那么经过观察我们可以发现,我们DP转移范围绝对在i-2~1-3

image

调一下枚举范围即可

贪心AC

image

附 · 线段树AC

image

贪心算法没有什么代码模板,总之就这样水过去了

以后想起来有什么要补充的再发帖吧

不要小看贪心哦

下课!!!

1 个赞

在贪心和线段树中选择了分块(

:+1::+1::+1: