每日总结2021.5.6(补)

本文探讨了几道与动态规划和最长单调子序列相关的算法题目,包括Acwing1017.怪盗基德的滑翔翼、Acwing1014.登山等。这些题目通过转化成最长上升子序列模型进行求解,强调了问题分析和状态转移方程的重要性。文章还提到了Acwing1012.友好城市和Acwing1016.最大上升子序列和,同样利用最长上升子序列模型解决,并给出了相应的解题思路。
摘要由CSDN通过智能技术生成

1.Acwing 1017. 怪盗基德的滑翔翼

大意:给定k组数据,每组一个整数n,接下来一行n个整数。每次可以选一个位置,向前或向后(但只能是其中一个方向)求最长的递减子序列。其中对于递减的实质为严格单调下降。

思路:首先看到最长递减子序列,想到动态规划最长上升子序列模型。在看数据范围,n<=100,不用优化。对于最长上升子序列模型,首先状态表示:f[i]表示以a[i]结尾的上升子序列,属性为最大值。对于状态划分一般以 ‘最后’ 为依据,寻找状态转移方程。对于此题 ‘最后’ f[i]的值是否变化,当算f[i] 时,很显然要和倒数第二个比较来判断是不是递增。所以状态划分就以倒数第二个数为依据,即倒数第二个数不存在,倒数第二个数为a[1],为a[2]…为a[i-1]。所以状态转移方程为
i f ( a [ i ] > a [ k ] ) f [ i ] = m a x ( f [ i ] , f [ k ] + 1 ) 1 < = k < = i − 1 ) 倒 数 第 二 个 为 空 时 f [ i ] = 1 ; if(a[i]>a[k]) f[i]=max(f[i], f[k]+1)1<=k<=i-1) 倒数第二个为空时f[i]=1; if(a[i]>a[k])f[i]=max(f[i],f[k]+1)1<=k<=i1)f[i]=1;
回到此题,求从某点到两边的最长递减子序列,首先从该点往前的递减子序列就是从前向后递增子序列,对于另外一个就是从后向前的递增子序列,预处理出来,遍历每个点求max就行了。

总结:实质还是问题分析,然后转化成最长上升子序列。

2.Acwing \1014. 登山

大意:给定一个n,n<=1000,求最长的峰序列长度,对于峰序列是指一个序列中一旦开始下降就单调递减。即a[1]<a[2]<…a[k]>a[k+1]>…

思路:先来想想峰序列是啥?说白了就是先单调增然后单调减的序列。和上一题差不多,不同的是最后遍历所有点求前后之和-1的最大值。

总结:分析出最长上升子序列模型,然后就很显然了。

3.Acwing \1012. 友好城市 大意:给定n,n<=5000,接下来n行,代表南北方向一 一对应的两座城市的坐标,可以在对应的城市建立航线,问最多可以建立多少条互不相交的航线。

思路:首先想到什么时候航线会相交,例如两对城市 x1,y1和x2,y2。只有x1,x2和y1,y2单调性不一致的时候才会相交。所以想到先把一侧排下序,然后看另一侧的最长单调子序列就行了。实质还是最长上升子序列模型。

4.Acwing \1016. 最大上升子序列和 没什么说的,最大上升子序列和,和长度差不多,只需要将+1,改成+a[i]就行了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值