记录编号 160895 评测结果 AAAAAAAAAA
题目名称 挖地雷 最终得分 100
用户昵称 Gravatarforever 是否通过 通过
代码语言 C++ 运行时间 0.021 s
提交时间 2015-04-29 19:53:28 内存使用 0.66 MiB
显示代码纯文本
#include<iostream>
#include<cstdlib>
#include<cstdio>
using namespace std;
int a[300][300],n,f[300],lei[300],d[300],qian[300];
int maxx=0,x,y,kk;
int main()
{   freopen("landmine.in","r",stdin);
	freopen("landmine.out","w",stdout);
	cin>>n;
	for(int i=1;i<=n;++i)
	 cin>>lei[i];
	while(cin>>x>>y&&x!=0)
	{
       if(a[x][y]==0)
		 a[x][y]=1;
	}
	f[n]=lei[n];
	for(int i=n-1;i>=1;--i)
	{   int l=0;
	    kk=0;
		for(int j=i+1;j<=n;++j)
		 {
		  if(a[i][j]&&f[j]>l)
		   { l=f[j];//需用l记录此边指向点的当前地雷数;因为有可能没有边;
			 kk=j;//用kk记录其后驱点;
		   }/*if(a[i][j]&&f[i]<=f[j]+lei[i])
               {
                f[i]=f[j]+lei[i];
                qian[i]=j;
               }*///这是错误的解法;
		  f[i]=l+lei[i];
		  qian[i]=kk;
		 //cout<<i<<" "<<kk<<endl;
		}
	}
	int k=1;
	for(int i=1;i<=n;++i)
	 if(f[i]>=f[k])
	  {
			k=i;
			maxx=f[k];
	  }
	//cout<<k<<endl;
    int u=0;
	while(k!=0)
	{
		d[++u]=k;
		k=qian[k];
	}
	for(int i=1;i<u;++i)
	 cout<<d[i]<<"-";
	cout<<d[u]<<endl;
	cout<<maxx;
	//system("pause");
}