1 solutions

  • 0
    @ 2024-12-11 0:49:57

    C++ :

    #include<iostream>
    #include<cstdio>
    using namespace std;
    const int maxx=1001;
    int n,a[maxx],flag[maxx][maxx],f[maxx],road[maxx];//w为每个地窖的地雷数目,a为地窖与地窖之间是否连通,f记录从每个地窖开始挖最多能挖多少,c为记录路径 
    int main()
    {
        cin>>n;
        for(int i=1;i<=n;i++)
        cin>>a[i];
        int x=-1,y=-1;
    	while(x!=0 && y!=0)
    	{
    		cin>>x>>y;
    		flag[x][y]=1;    
    	}
        f[n]=a[n];//最后一个地窖开始能挖的就只有他自己的了,因为没有和它连着的地窖 
        for(int i=n-1;i>=1;i--)//从后往前 
        {
            int l=0,k=0;
            for(int j=i+1;j<=n;j++)
            {
                if(flag[i][j]==1 && f[j]>l)//这两个地窖相连并且要选一条能挖地雷最多的道路 
                {
                    l=f[j];//找最大 
                    k=j;//记录答案 
                }
            }
            f[i]=a[i]+l;//从i从发能挖的地雷 
            road[i]=k;//记录前驱 
        }
        int k=1;
        for(int i=1;i<=n;i++)
        {
            if(f[i]>f[k])//寻找能挖地雷最多的 
            k=i;
        }
        int t=k;
        cout<<k;//输出道路 
        k=road[k];
        while(k!=0)
        {
            cout<<"-"<<k;
            k=road[k];
        }
        cout<<endl;
        cout<<f[t]<<endl;//输出挖的地雷     
        return 0;
    }
    

    Pascal :

    program p26309;
    var n,m,max,i,x,y:longint;
        g:array[1..200,1..200]of boolean;
        f,s,w:array[1..200]of longint;
    procedure try;
    var i,j:longint;
    begin
      fillchar(f,sizeof(f),0);
      f[n]:=w[n];
      fillchar(s,sizeof(s),0);
      for i:=n-1 downto 1 do
        begin
          for j:=i+1 to n do
          if(g[i,j])and(f[j]>f[i])then
             begin
               f[i]:=f[j];
               s[i]:=j;
             end;
          inc(f[i],w[i]);
        end;
      max:=0;
      for i:=1 to n do
        if f[i]>max then
          begin
            max:=f[i];
            m:=i;
          end;
    end;
    begin
      readln(n);
      for i:=1 to n do read(w[i]);
      readln;
      readln(x,y);
      fillchar(g,sizeof(g),false);
      while(x<>0)and(y<>0)do
        begin
          g[x,y]:=true;
          readln(x,y);
        end;
      try;
      write(m);
      while s[m]<>0 do
        begin
          write('-',s[m]);
          m:=s[m];
        end;
      writeln;
      writeln(max);
    end.
    
    • 1

    Information

    ID
    774
    Time
    1000ms
    Memory
    128MiB
    Difficulty
    (None)
    Tags
    # Submissions
    0
    Accepted
    0
    Uploaded By