【动态规划】NOIP1999 拦截导弹

这道题真心挺水,不过也很经典,是动态规划的入门题目。

不过代码让我写乱了。。。凑活着一次AC吧。

题目描述

某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。

输入格式

输入数据为两行,
第一行为导弹的数目N(n<=1000)
第二行导弹依次飞来的高度,所有高度值均为不大于30000的正整数。

输出格式

输出只有一行是这套系统最多能拦截的导弹数和要拦截所有导弹最少要配备这种导弹拦截系统的套数。两个数据之间用一个空格隔开.


#include<iostream>
#include<string.h>
using namespace std;

struct Node{
	int h;
	int parent;
	int number;
};
Node node[1005];

int main(){
	int n,size,goal;
	bool check[1005];
	cin>>n;
	for(int i=0;i<n;i++)
		cin>>node[i].h;
	size=n;
	int counter=0;
	while(size>0){
		counter++;
		memset(check,false,size);
		for(int i=0;i<size;i++){
			node[i].number=1;
			node[i].parent=-1;
		}
		node[0].number=1;
		for(int i=1;i<size;i++){
			for(int j=i-1;j>=0;j--){
				if( (node[i].h<=node[j].h) 
					&& (node[i].number<node[j].number+1) ){						
					node[i].number=node[j].number+1;
					node[i].parent=j;
				}
			}
		}
		int maximum=-1;
		for(int i=0;i<size;i++){
			if(node[i].number>maximum){
				maximum=node[i].number;
				goal=i;
			}
		}
		if(counter==1)
			cout<<maximum<<" ";
		int ptr=goal;
		while(node[ptr].parent!=-1){
			check[ptr]=true;
			ptr=node[ptr].parent;
		}
		check[ptr]=true;
		//size=size-maximum;
		int k=0;
		for(int i=0;i<size;i++){
			if(check[i]==false){
				node[k++]=node[i];
			}
		}
		size=size-maximum;
	}
	cout<<counter<<endl;
	//system("pause");
	return 0;
}


你可能感兴趣的:(ini)