题解:P1410 子序列
Fire_Kylin · · 题解
思路
其实这一道题可以利用一个小结论:
如果出现最长下降子序列长度超过 2 的,一定不能分成两个严格递增的子序列。
其实这一个小结论的证明方法很简单,就是小学学过的鸽巢原理(即抽屉原理)。这个原理告诉我们 3 个下降的数字,放到两个盒子之中一定会有一个盒子是一定下降。
虽然听起来有点绕哈,但多读几遍就看懂了。
实现
由上面的小结论可以知道,我们只需要统计最长下降子序列的长度,判断其是否小于等于
最长下降子序列我就不赘述了,毕竟你都来做蓝题了不可能还不会这个。
ACcode
跟之前的码风不太一样哈。
#include <bits/stdc++.h>
using namespace std;
int c[2008], f[2008], n;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
while(cin >> n)
{
memset(f, 0, sizeof(f));
int ans = 0;
for (int i = 1 ; i <= n ; i++) cin >> c[i];
for (int i = 1 ; i <= n ; i++)
{
f[i] = 1;
for (int j = 1 ; j < i ; j++) if (c[i] <= c[j]) f[i] = max(f[i], f[j] + 1);
ans = max(ans, f[i]);
}
if (ans <= 2) cout << "Yes!\n";
else cout << "No!\n";
}
return 0;
}