1 solutions
-
0
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