1 条题解

  • 0
    @ 2023-6-11 12:16:30

    C++ :

    #include<iostream>
    #include<cstring> 
    using namespace std;
    
    int main(){
    	
    	int n;//地窖个数 
    	int f[201];//表示从第i个地窖开始最多挖出的地雷数:
    	int w[201];//表示每个地窖的藏雷数
    	int c[201];//记录路径
    	
    	bool a[201][201];//表示从第i个地窖到第j个地窖是否有通路
    	
    	//初始化数组
    	memset(f,0,sizeof(f));
    	memset(w,0,sizeof(w));
    	memset(c,0,sizeof(c));
    	memset(a,false,sizeof(a));
    	
    	cin>>n;//输入地窖的个数 
    	
    	//输入每个地窖的藏雷数 
    	for(int i=1;i<=n;i++){
    		cin>>w[i];
    	}
    	
    	
    	int x,y; 
    	//输入从第i个地窖到第j个地窖是否有通路
    	do{
    		cin>>x>>y;
    		if((x!=0)&&(y!=0)) a[x][y]=true;
    		
    	}while((x!=0)||(y!=0));
    	
    	int t;//临时变量 存放f[i]的地雷数 
    	int k;//存放最优路径 
    	
    	//从第n个坑开始挖,下面没有坑,也就是第N个坑的雷数 
    	f[n]=w[n];
    	//从第n-1个坑开始挖 
    	for(int i=n-1;i>=1;i--){
    		t=0;
    		k=0;
    		//有通路的条件是i<j<=n; a[i][j]=true 
    		for(int j=i+1;j<=n;j++){
    			//有通路,并且下一个坑的地雷数比较多 
    			if((a[i][j]) && (f[j]>t)){
    				t=f[j];
    				k=j;
    			}
    		}
    		//从第i个坑开始挖的最大值 
    		f[i]=t+w[i];
    		c[i]=k;	
    	}
    	
    	//计算最多的地雷数
    	k=1;//假设第一个坑开始挖出地雷数最大多
    	int max=0;//挖出最多地雷数 
    	//从第二个坑开始和第一个坑比较 
    	for(int j=2;j<=n;j++){
    		if(f[j]>f[k]){
    			k=j;//将最大挖雷的坑的序号保存到k 
    		}
    	} 
    	
    	max=f[k];
    	
    	cout<<k;//输出起始坑的序号 
    	//输出路径
    	k=c[k];
        while(k!=0){
        	cout<<"-"<<k;
        	k=c[k];
    	} 
    	
    	cout<<endl;
    	cout<<max<<endl;
     
    }
    
    • 1

    信息

    ID
    2200
    时间
    1000ms
    内存
    16MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者