对于长度为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