比赛 20140421 评测结果 WWWWWWAAWW
题目名称 导弹拦截 最终得分 20
用户昵称 超级傲娇的AC酱 运行时间 0.618 s
代码语言 C++ 内存使用 0.32 MiB
提交时间 2014-04-21 16:15:44
显示代码纯文本
/*
 Dirworh
 */
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
struct pos
{
    int x,y,z;
};
vector<pos>Pos;
int F1[1002],n,Path[1002];
bool v[1002];
int DP();
void Opt_V();
bool Jud();
void init();

int main()
{
	freopen("bomba.in","r",stdin);
	freopen("bomba.out","w",stdout);
    pos P;
    int i,j,Ans=0;
    cin>>n;
    init();for(i=0;i<n;i++)v[i]=false;
    for(i=0;i<n;i++)
    {
        cin>>P.x>>P.y>>P.z;
        Pos.push_back(P);
    }
    cout<<DP()<<endl;
	int Len=n,D;
    while(!Jud())
    {
	   D=DP();
	   Opt_V();
	   Len-=D;
	   Ans++;
    }
	cout<<Ans;
    return 0;
}
bool Jud()
{
	bool B=true;
	for(int i=0;i<n;i++)
		B=B&v[i];
	return B;
}
int DP()
{
	int i,j,loc=0,Max=0;
	for(i=1;i<n;i++)
    {
		if(!v[i])
            for(j=0;j<i;j++)
                if(Pos[i].x>Pos[j].x&&Pos[i].y>Pos[j].y&&Pos[i].z>Pos[j].z&&!v[j])
			    {
                    F1[i]=max(F1[j]+1,F1[i]);
				    Path[i]=j;
				    //标记数组v与路径数组p
				    /*
				    将每次路径上的节点进行标记。
				    并在v中标记,在DP时加上条件v
				    时间复杂度上界为n^3
				    */
			    }
	}
	//return *max_element(F1,F1+n);
	for(i=0;i<n;i++)
		if(F1[i]>Max&&!v[i])
			Max=F1[i],loc=i;
	return F1[loc];
}
void Opt_V()
{
	int i,loc=0,Max=0;
	for(i=0;i<n;i++)
		if(F1[i]>Max&&!v[i])
			Max=F1[i],loc=i;
	while(loc!=-1)//位置指向自身无法处理单元素情形
	{
		v[loc]=true;
		loc=Path[loc];
	}
}
void init()
{
	for(int i=0;i<=n;i++)F1[i]=1,Path[i]=-1;
}