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<=i−1)倒数第二个为空时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]就行了。