http://oj.tsinsen.com/A1120
分析:第一问是最长不降子序列,第二问是贪心,重复第一问的操作直到所有导弹都被拦截即可
代码:
#include "cstdio"
using namespace std;
int cnt, s[50050];
int Dp(const int Num[], int n) {
int dp[50050], prev[50050], Out = 1, Last = 0;
for (int i = 0; i < 50050; ++i) {
prev[i] = i; dp[i] = 1;
}
for (int i = 0; i < n; ++i)
for (int j = 0; j < i; ++j)
if (s[Num[j]] >= s[Num[i]] && dp[i] < dp[j] + 1) {
dp[i] = dp[j] + 1; prev[i] = j;
if (Out < dp[i]) Out = dp[Last = i];
}
while (prev[Last] != Last) {
s[Num[Last]] = -1; Last = prev[Last];
}
s[Num[Last]] = -1;
return Out;
}
int main() {
while (~scanf("%d", &s[cnt++]) && getchar() != '\n');
int Num[50050] = { 0 }, Out = 0;
for (int i = 0; i < cnt; ++i)
Num[i] = i;
printf("%d\n", Dp(Num, cnt));
for (; ; ) {
Out += 1;
int Num[50050] = { 0 }, n = 0;
for (int i = 0; i < cnt; ++i) if (s[i] != -1)
Num[n++] = i;
if (n <= 0) break;
Dp(Num, n);
}
printf("%d\n", Out);
return 0;
}