线性dp-LIS题目2(导弹拦截III)

题目链接

解题思路

我们定义 d p i 0 dpi0 dpi0为第 i i i个数作为下降子序列最后一个数的最大值。 d p i 1 dpi1 dpi1为第 i i i个数作为上升子序列最后一个数的最大值。

题目理解

任何一个数一开始都可以选中,我们可以这样理解:第一个数可以理解为是在一个上升子序列的最后一个数,之后如果我们碰到后面的一个数比第一个小,那这个数可以接在第一个数的最长下降子序列后面,之后遇到一个数比第二个数大,那第三个数可以接在第二个数的最长上升子序列后面,又遇到一个数比第三个数小,那第四个数可以接在第三个数的最长下降子序列后面,以此类推...当然,这里用的是可以接在,是否要接在状态转移判断。

初始化

题目理解里说了"第一个数可以理解为是在一个上升子序列的最后一个数",所以我们初始化 d p i 1 = 1 ( 1 < = i < = n ) dpi1=1(1<=i<=n) dpi1=1(1<=i<=n)。

状态转移

对 n n n个数,都遍历一遍,遍历到第 i i i个数,内层循环用变量 j j j遍历 1 至 i − 1 1至i-1 1至i−1,如果数 i i i比数 j j j小,那我们看一下数 i i i接在数 j j j的最长上升子序列后面能不能更长,如果可以,那么就接,否则不接。同理,如果数 i i i比数 j j j大,那我们看一下数 i i i接在数 j j j的最长下降子序列后面能不能更长,如果可以,那么就接,否则不接。状态转移方程:

i f ( a j < a i ) d p i 1 = m a x ( d p i 1 , d p j 0 + 1 ) ; if (aj < ai)dpi1 = max(dpi1, dpj0 + 1); if(aj<ai)dpi1=max(dpi1,dpj0+1);

i f ( a j > a i ) d p i 0 = m a x ( d p i 0 , d p j 1 + 1 ) ; if (aj > ai)dpi0 = max(dpi0, dpj1 + 1); if(aj>ai)dpi0=max(dpi0,dpj1+1);

最后,用ans存储 d p i 0 dpi0 dpi0和 d p j 0 dpj0 dpj0的最大值。

AC Code

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
int a[1005], n, dp[1005][2];

int main() {
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
		dp[i][1] = 1;
	}
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j < i; j++) {
			if (a[j] < a[i])
				dp[i][1] = max(dp[i][1], dp[j][0] + 1);
			if (a[j] > a[i])
				dp[i][0] = max(dp[i][0], dp[j][1] + 1);
		}
	}
	int ans = 0;
	for (int i = 1; i <= n; i++) {
		ans = max(ans, dp[i][0]);
		ans = max(ans, dp[i][1]);
	}
	cout << ans;
	return 0;
}
相关推荐
zhenaibo5214 分钟前
如何与导师有效沟通选题?
算法
熊猫钓鱼>_>9 分钟前
大学图论第 6 讲:网络流与二分图匹配——对偶性让瓶颈自己现形
开发语言·算法·面试·职场和发展·图论·校招·面经
没有钱的钱仔15 分钟前
最大似然估计(MLE)通俗理解
算法·机器学习·概率论
yi01121 分钟前
LeetCode 424. 替换后的最长重复字符|不定长滑动窗口:如何判断窗口是否合法?
笔记·python·算法·leetcode·双指针·滑动窗口
Nebula_g35 分钟前
JavaSE高级:动态代理
java·开发语言·算法·javase
垆边人似月.1 小时前
华为题:盛最多水的容器
数据结构·算法
怦然丶心动1 小时前
用 Java 把干支历法算清楚:从节气切年到可读摘要
java·算法·vue·独立开发·spring boot / spring
Zachery Pole1 小时前
具身智能强化学习(1)引言
算法·机器学习
All for pursuit.1 小时前
【动态规划-11】279.完全平方数
数据结构·c++·算法·leetcode·动态规划
淡海水1 小时前
02-06-原理篇-增量式GC与并发GC
算法·unity·c#·并发·gc·增量