2 条题解

  • 0
    @ 2024-11-16 9:15:07
    #include<bits/stdc++.h>
    using namespace std;
    int n,a[105],ma[105],maxxx[105][105],cnt[105],macnt,maa[105],maxx;
    /*
    mamxx为到i最优方案
    cnt为到i最优方案挖雷次数
    macnt为总最优方案挖雷次数
    maa为总最优方案
    maxx为能挖到最多的地雷数
    */
    bool b[105][105];
    int main(){
    	cin>>n;
    	for(int i=1;i<=n;i++){
    		cin>>a[i];
    	}
    	for(int i=1;i<=n;i++){
    		for(int j=i;j<=n;j++){
    			cin>>b[i][j];
    		}
    	}
    	for(int i=n;i>=1;i--){
    //一定要倒着推,这样才能找到前面走过的路径
    		int s=0;
    		for(int j=i;j<=n;j++){
    			if(b[i][j]==1){//当有通路 
    				if(ma[j]>s){
    					s=ma[j];
    					cnt[i]=cnt[j]; 
    					for(int k=1;k<=cnt[j];k++){
    						maxxx[i][k]=maxxx[j][k];
    					}//转移推出最优方案 
    				}
    			}
    		}
    		ma[i]=s+a[i];cnt[i]++;
    		maxxx[i][cnt[i]]=i;//把i放入方案 
    		if(ma[i]>maxx){
    			maxx=ma[i];macnt=cnt[i];
    			for(int j=1;j<=macnt;j++) maa[j]=maxxx[i][j];//再推出总最优方案 
    		}
    	}
    	cout<<maxx<<endl;
    	for(int i=macnt;i>=1;i--) cout<<maa[i]<<" ";
    //因为是倒着推的,所以路径也是反的,因题目要求输出正的方案,所以要反的输出 
    	return 0;
    }
    /*
    6
    8 14 2 17 9 26
    0 0 1 1 0 0
    0 1 0 0 0
    0 1 0 1
    0 0 0
    0 1
    0
    */
    
    • 0
      @ 2023-12-16 14:53:54
      #include<bits/stdc++.h>
      using namespace std;
      int main()
      {
        int t,maxn,n,i,j,v[105]={},a[105],b[105][105]={},f[105]={};
        bool x;
        cin>>n;
        for(i=1;i<=n;++i)
        {
        	cin>>a[i];
        	f[i]=a[i];
        }
        for(i=1;i<=n;++i)
        for(j=i;j<=n;++j)
        {
        	cin>>x;
        	b[i][j]=x;
        }
        f[n]=a[n];
        for(i=n-1;i>=1;--i)
        {
        	maxn=0;
        	t=0;
        	for(j=i+1;j<=n;++j)
        	if(b[i][j])
        	{
        	  if(maxn<f[j])
        	  {
        	  	maxn=f[j];
        	  	t=j;
      	  }
      	}
      	v[i]=t;
      	f[i]=maxn+a[i];
        }
        maxn=-1;
        t=0;
        for(i=1;i<=n;++i)
        if(maxn<f[i])
        {
        	maxn=f[i];
        	t=i;
        }
        cout<<maxn<<'\n';
        cout<<t;
        while(v[t])
        {
        	t=v[t];
        	cout<<' '<<t;
        }
        return 0;
      }
      
      • 1

      信息

      ID
      23
      时间
      1000ms
      内存
      256MiB
      难度
      3
      标签
      (无)
      递交数
      148
      已通过
      75
      上传者