首页 > 其他分享 >「杂题乱刷」CF1272D

「杂题乱刷」CF1272D

时间:2023-12-12 11:35:36浏览次数:30  
标签:dp1 long 200010 CF1272D 序列 杂题 dp define

题目链接

CF1272D Remove One Element

题意简述

给定一个长度为 \(n\) 的序列,你需要求出至多删除一个数后的这个序列的最长上升子串。

解题思路

首先我们可以想一下这题的弱化版,给定一个长度为 \(n\) 的序列,你需要求出至多删除一个数后的这个序列的最长上升子序列。

这题我们可以设 \(dp_i\) 为到位置 \(i\),所能得到的最长子序列,然后代码就很容易实现了。

参考代码:

#include<bits/stdc++.h>
using namespace std;
long long n,a[5010],dp[5010],ans;
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define QwQ return 0;
int main()
{
	IOS;
	cin>>n;
	for(int i=1;i<=n;i++)
		cin>>a[i],dp[i]=1;
	for(int i=2;i<=n;i++)
	{
		for(int j=i-1;j>=1;j--)
			if(a[i]>a[j])
				dp[i]=max(dp[j]+1,dp[i]);
		ans=max(ans,dp[i]);
	}
	cout<<ans;
	QwQ;
}

然后我们将这题加强一下,改为给定一个长度为 \(n\) 的序列,你需要求出这个序列的最长上升子序列。

这时我们维护 \(dp1_i\) 表示到第 \(i\) 个数可以达到的最长子串(从 \(1\) 开始),维护 \(dp2_i\) 表示到第 \(i\) 个数可以达到的最长子串(从 \(n\) 开始),这样维护也是比较轻松的。

参考代码:

#include<bits/stdc++.h>
using namespace std;
long long n,a[200010],dp1[200010],dp2[200010],ans;
#define map unordered_map
#define forl(i,a,b) for(register long long i=a;i<=b;i++)
#define forr(i,a,b) for(register long long i=a;i>=b;i--)
#define lc(x) x<<1
#define rc(x) x<<1|1
#define lowbit(x) x&-x
#define pb push_back
#define pf push_front
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define endl '\n'
#define QwQ return 0;
int main()
{
	IOS;
	cin>>n;
	forl(i,1,n)
		cin>>a[i];
	forl(i,1,n)
	{
		if(a[i]>a[i-1])
			dp1[i]=dp1[i-1]+1;
		else
			dp1[i]=1;
	}
	forr(i,n,1)
	{
		if(a[i]<a[i+1])
			dp2[i]=dp2[i+1]+1;
		else
			dp2[i]=1;
	}
	forl(i,1,n)
	{
		ans=max({ans,dp1[i],dp2[i]});
		if(a[i]<a[i+1])	
			ans=max(ans,dp1[i]+dp2[i+1]);
	}
	cout<<ans;
	QwQ;
}

然后就是此题了,相信只要看懂上面的内容,应该都可以写出来的,我们直接多考虑一个不考虑中间的数的情况即可。

参考代码

#include<bits/stdc++.h>
using namespace std;
long long n,a[200010],dp1[200010],dp2[200010],ans;
#define map unordered_map
#define forl(i,a,b) for(register long long i=a;i<=b;i++)
#define forr(i,a,b) for(register long long i=a;i>=b;i--)
#define lc(x) x<<1
#define rc(x) x<<1|1
#define lowbit(x) x&-x
#define pb push_back
#define pf push_front
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define endl '\n'
#define QwQ return 0;
int main()
{
	IOS;
	cin>>n;
	forl(i,1,n)
		cin>>a[i];
	forl(i,1,n)
	{
		if(a[i]>a[i-1])
			dp1[i]=dp1[i-1]+1;
		else
			dp1[i]=1;
	}
	forr(i,n,1)
	{
		if(a[i]<a[i+1])
			dp2[i]=dp2[i+1]+1;
		else
			dp2[i]=1;
	}
	forl(i,1,n)
	{
		ans=max({ans,dp1[i],dp2[i]});
		if(a[i]<a[i+2])	
			ans=max(ans,dp1[i]+dp2[i+2]);
	}
	cout<<ans;
	QwQ;
}

标签:dp1,long,200010,CF1272D,序列,杂题,dp,define
From: https://www.cnblogs.com/wangmarui/p/17896396.html

相关文章

  • 【杂题乱写】12 月北京省选杂题选讲 1
    F.CodeForces-1446D2FrequencyProblem(HardVersion)*3000如果全局众数不唯一,则答案是\(n\)。可以发现一个性质:答案区间的众数一定包含全局众数。否则一定可以扩展这个区间直到全局众数成为区间众数,如果此时区间众数出现次数又增加了,那么可以继续扩展。仔细思考这个性质......
  • 2023.12 杂题
    Ifoundithard,it'shardtofind.Ohwellwhatevernevermind.目录CF1904ETreeQueriesCF1904FBeautifulTreeABC332GNotTooManyBallsCF1904ETreeQueriesTag:T-欧拉序;S-线段树。注意到\(\sumk\)和\(n\)同级,大抵是一个和\(k\)相关的做法,虚树大概是不可行的,......
  • 「杂题乱刷」CF1904B
    题目链接CF1904BCollectingGame题意简述给你一个由\(n\)个正整数组成的序列\(a\)和一个分数。如果你的分数大于或等于\(a_i\),那么你可以将分数增加\(a_i\),并从序列中删除\(a_i\),你需要求出对于每一个\(a_i\)为你的分数时你可以从这个序列中删除数的最大数量。解题......
  • 「杂题乱刷」洛谷P1216
    题目链接一道dp的入门题。\(O(2^n)\):考虑直接爆搜,可以考虑到所有情况。\(O(n^2)\):考虑\(dp\),设\(dp_{i,j}\)代表到达第\(i\)层第\(j\)个数所能达到的最大值。状态转移方程为\(dp_{i,j}=a_{i,j}+\max(dp_{i-1,j-1},dp_{i-1,j})\)。最终答案就是\(\max(dp_{n,1},d......
  • 「杂题乱刷」洛谷P1544
    题目链接数字三角形的变形。直接在原来的基础上加个判断\(3\)倍的就行了。参考代码:点击查看代码#include<bits/stdc++.h>usingnamespacestd;longlongn,m,ans=-1e18,a[110][110],dp[110][110][5010];#definelc(x)x<<1#definerc(x)x<<1|1#definelowbit(x)x&-......
  • 「杂题乱刷」洛谷P2285
    题目传送门一道小清新动态规划题,直接设\(dp[i]\)表示前\(i\)个鼹鼠最多能打到几个,然后状态转移方程也很好想了。参考代码:点击查看代码#include<bits/stdc++.h>usingnamespacestd;longlongn,m,ans,dp[10010],x[10010],y[10010],times[10010];#definelowbit(x)x&-......
  • 「杂题乱刷」洛谷P1064
    题目传送门一道算是dp的板子题了。题意大概就是01背包+捆绑。首先回顾一下01背包,一个比较基础的dp题,状态转移方程也很好想,是\(dp[i][j]=\max(dp[i][j],dp[i-1][j-w[i]]+v[i])\)。代码实现如下:点击查看代码#include<bits/stdc++.h>usingnamespacestd;longlo......
  • 杂题乱写 1
    用树剖补完了普及组OJ所有LCA的题DistanceQueries距离咨询POJ-1986翻译:FJ有\(N(2\leN\le40000)\)个农场,标号\(1\)到\(N\)。\(M(2\leM\le40000)\)条的不同的垂直或水平的道路连结着农场,道路的长度不超过\(1000\).这些农场的分布就像下面的地图一样,图中农场用\(F1\cdotsF7\)......
  • 网络流杂题
    一道一道记太浪费文章篇数了。先记几种dinic的复杂度。一般网络:\(O(n^2m)\)各边容量为\(1\)的网络:\(O(m\min\{m^{\frac{1}{2}},n^{\frac{2}{3}}\})\)二分图:\(O(m\sqrtn)\)更详细的分析。最大流UVA10735混合图的欧拉回路存在欧拉回路的判断条件:每个点出度=入度......
  • 【杂题乱写】2023-11 #2
    ARC147CFindthemaximumLandtheminimumRtobemLandmRrespectively.IfmL<=mRholds,wecansetevery\(x_i\)tobemLandthecontributionwillbe0.Otherwisewe'dgreedilyset\(R_{\arg\minR}=mR\)and\(L_{\arg\maxL}=mL\).All......