最长递增子序列--蓝桥oj3046拍照

题目链接

arr[]  1700 1701  1702  1703  1704  1705

dp1[]   1       2       3        4         5        6

dp2[]    6      5       4        3         2         1

sum[]=dp1[]+dp2[]

sum[]    7     7       7        7         7         7

7是最大的倒叙和正序的人数之和,那么要算出最少的需要改变出队,也就是删除的

n-最大人数之和+1

所以最后答案是6-7+1=0

这道题跟我上一篇的合唱队形特别相似,想了解具体思路,看我上篇文章

相似题解

需要注意的是这个跟合唱排队不同,这个是可以等于的,允许等于存在,所以一定要加上等于,缺少了就过不了测试点。

下面是代码:

#include <bits/stdc++.h>
using namespace std;
int n, arr[110], dp1[110], dp2[110], sum[110];

int main() {
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> arr[i];
	}
	for (int i = 1; i <= n; i++) {
		dp1[i] = 1;
		for (int j = 1; j < i; j++) {
			if (arr[i] >= arr[j]) {
				dp1[i] = max(dp1[j] + 1, dp1[i]);
			}
		}
	}
	for (int i = n; i >= 1; i--) {
		dp2[i] = 1;
		for (int j = n; j > i; j--) {
			if (arr[i] >= arr[j]) {
				dp2[i] = max(dp2[j] + 1, dp2[i]);
			}
		}
	}
	for (int i = 1; i <= n; i++) {
		sum[i] = dp1[i] + dp2[i];
	}
	sort(sum + 1, sum + n + 1);
	cout << n - sum[n] + 1;
	return 0;
}

这里是红糖,记录我的小白成长史。

如果觉得对你有帮助的话可以点个赞,点个关注,创作不易,请多多支持。

我们下篇文章见!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值