站外
  • 板块学术版
  • 楼主Nostopathy
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/7/23 10:19
  • 上次更新2024/7/23 11:13:05
查看原帖
站外
1286053
Nostopathy楼主2024/7/23 10:19

对于长度为n(5000以内),下标为1~n的数组a,选择一个1-n之间的数字x,使a[1]~a[x]之间的数字任意减去一个数字。求这样一次操作之后的最长不下降子序列的长度。 样例输入 5 3 4 5 1 2 样例输出 5

#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
int n, num;
int nums[5001], DP[5001];
void lis() {
	for (int i = 1; i <= n; i++)
        DP[i] = 1;
    
    for (int i = 2; i <= n; i++) {
        for (int j = 1; j < i; j++) {
            if (nums[j] <= nums[i])
                DP[i] = max(DP[i], DP[j] + 1);
        }
    }
}
int main(){
	cin >> n;
	for(int i = 1; i <= n; ++ i) { cin >> nums[i]; }
	lis();
	for(int i = 1; i <= n; ++ i) {
		int first = 0, second = 0;
		for(int l = 1; l <= i; ++ l) { first = max(first, DP[l]); }
		for(int l = i + 1; l <= n; ++ l) { second = max(second, DP[l]); }
		num = max(num, first + second);
	}
	cout << num << '\n';
}

只有2pts,QAQ

2024/7/23 10:19
加载中...