ダイナミックプランニングミサイル迎撃


テーマはある国が敵国のミサイル襲撃を防御するために、ミサイル迎撃システムを発展させたことを述べている.しかし、このミサイル迎撃システムには欠陥がある.最初の砲弾は任意の高さに達することができるが、その後、各砲弾は前の砲弾の高さを上回ることができない.ある日、レーダーは敵国のミサイル襲撃を捉えた.このシステムはまだ試用段階にあるため、1つのシステムしかないため、すべてのミサイルを遮断できない可能性がある.
ミサイルが順次飛んでくる高さ(レーダーが与えた高さデータはle 50000≦50000の正の整数)を入力し、このシステムが最大でどれだけのミサイルを迎撃できるかを計算し、すべてのミサイルを迎撃するには少なくともどれだけのミサイル迎撃システムを配備しなければならないかを計算します.
フォーマット1行を入力し、数個の整数(個数≦100000)
出力フォーマットは2行で、各行に1つの整数で、最初の数字はこのシステムが最大でどれだけのミサイルを遮断できるかを示し、2番目の数字はすべてのミサイルを遮断するには少なくともどれだけのミサイル遮断システムを配備するかを示しています.
入出力サンプル
入力#1:
389 207 155 300 299 170 158 65

出力:
6
2
#include
#define mm(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
int a[100001],ans1=-1,ans2=-1,n;
int f[100001];
int main()
{
	while(scanf("%d",&a[++n])!=EOF);
	n--;
	for(int i=n;i>=1;i--){
		f[i]=1;
		for(int j=i+1;j<=n;j++){
			if(a[j]<=a[i]) f[i]=max(f[i],f[j]+1);
		}
		ans1=max(ans1,f[i]);
	}
	mm(f,0);
	for(int i=1;i<=n;i++){
		f[i]=1;
		for(int j=1;j<i;j++){
			if(a[i]>a[j]) f[i]=max(f[i],f[j]+1);
		}
		ans2=max(ans2,f[i]);
	}
	cout << ans1 << endl << ans2;
	return 0;
}