トレーニングアルゴリズム迎撃ミサイル
制限時間:メモリ制限が1.0S:256.0メガバイト
問題の説明
ミサイル迎撃システムを開発するために、敵のミサイル攻撃を防御するために、国インチ 任意の高さに到達するための最初のラウンドですが、しかし、各シェルと状況は高さを持って前よりも大きくすべきではない。しかし、そのようなミサイル迎撃システムは欠陥を持っています。ある日、レーダーは、入ってくる敵のミサイルを拾いました。システムは、ベータまだそう唯一のシステムであるため、すべてのミサイルを迎撃しないことがあります。よう
(3万よりも正の整数大きいではない与えられたレーダデータの高さ)ミサイルターン浮上量を入力し、計算どのくらいの切片へのシステムアップミサイル、あなたはすべてのミサイルを傍受するようにミサイル迎撃システムを搭載するセットの最小数をしたい場合。
フォーマット入力
ミサイル浮上高さにするために、ラインを
出力形式
二行、それぞれ、システムの最小値と切片および全ミサイルの数に迎撃ミサイルの数まで
サンプル入力
389,207,155,300,299 170 158 65
サンプル出力
。6
2
#include <stdio.h>
#include <stdlib.h>
int max(int a, int b)
{
return a > b ? a : b;
}
int longest_nonstrictly_decreasing_subsequence(int arr[], int n)
{
int *f = (int *)malloc(n * sizeof(int));
f[0] = 1;
for (int i = 1; i < n; ++i)
{
f[i] = 1;
for (int k = 0; k < i; ++k)
{
if (arr[k] >= arr[i])
f[i] = max(f[i], f[k] + 1);
}
}
int max_len = 0;
for (int i = 0; i < n; ++i)
max_len = max(max_len, f[i]);
return max_len;
}
int longest_strictly_increasing_subsequence(int arr[], int n)
{
int *f = (int *)malloc(n * sizeof(int));
f[0] = 1;
for (int i = 1; i < n; ++i)
{
f[i] = 1;
for (int k = 0; k < i; ++k)
{
if (arr[k] < arr[i])
f[i] = max(f[i], f[k] + 1);
}
}
int max_len = 0;
for (int i = 0; i < n; ++i)
max_len = max(max_len, f[i]);
return max_len;
}
int main()
{
int heights[10005] = { 0 };
int n = 0;
for (n = 0; scanf("%d", &heights[n]) != EOF; ++n)
;
printf("%d\n", longest_nonstrictly_decreasing_subsequence(heights, n));
printf("%d", longest_strictly_increasing_subsequence(heights, n));
return 0;
}