1 条题解
-
0
C :
#include "stdio.h" int n; int max,s,e; int a[201],f[201][201]; void F() { int i; if(s==e) { printf("%d\n",e); return ; } printf("%d-",s,e); for(i=s+1;i<=e;i++) if(f[s][i]+f[i][e]-a[i]==f[s][e]) { s=i; F(); return; } } int main() { int i,j,k; scanf("%d",&n); for(i=1;i<=n;i++) { scanf("%d",&a[i]); f[i][i]=a[i]; } scanf("%d%d",&s,&e); while(s&&e) { f[s][e]=a[s]+a[e]; scanf("%d%d",&s,&e); } s=e=0; for(i=1;i<=n;i++) { for(j=i;j>0;j--) { for(k=j;k<=i;k++) { if(f[j][k]&&f[k][i]&&f[j][i]<f[j][k]+f[k][i]-a[k]) f[j][i]=f[j][k]+f[k][i]-a[k]; } if(f[j][i]>f[s][e]) s=j,e=i; } } max=f[s][e]; F(); printf("%d\n",max); return 0; }
C++ :
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int n,a[201],b[201],f[201],g[201][201]={0};//f[i]数组表示从第i个地窖起挖 void init(); void work(); int main() { init(); work(); return 0; } void init() { cin>>n; for(int i=1;i<=n;i++)cin>>a[i]; while(1) { int x,y; cin>>x>>y; if(x==0)break; g[x][y]=1; } } void work() { f[n]=a[n]; for(int i=n-1;i>0;i--) { int my_max=0,k=0; for(int j=i+1;j<=n;j++) { if(g[i][j]&&f[j]>my_max) { my_max=f[j]; k=j; } } f[i]=my_max+a[i]; //cout<<"i="<<i<<' '<<k<<' '<<f[i]<<endl; b[i]=k; } int tot=0,k=0; //for(int i=1;i<=n;i++)cout<<f[i]<<' '; for(int i=1;i<=n;i++)if(tot<f[i]){tot=f[i];k=i;} cout<<k; k=b[k]; while(k!=0) { cout<<'-'<<k; k=b[k]; } cout<<endl; cout<<tot<<endl; }
Pascal :
var ans,i,j,k,n,tou:longint; num,x,y,f,trr:array[0..20000]of longint; bian:array[0..2000,0..2000]of longint; function max(i,j,k,l:longint):longint; begin if i>=j then exit(i) else begin trr[l]:=k; exit(j); end; end; function max2(i,j,k:longint):longint; begin if i>=j then exit(i) else begin tou:=k; exit(j); end; end; begin read(n); for i:=1 to n do read(num[i]); i:=1; read(x[i],y[i]); while (x[i]<>0)and(y[i]<>0) do begin inc(bian[y[i],0]); bian[y[i],bian[y[i],0]]:=x[i]; inc(i); read(x[i],y[i]) end; for i:=1 to n do f[i]:=num[i]; for i:=n downto 1 do for j:=1 to bian[i,0] do f[bian[i,j]]:=max(f[bian[i,j]],f[i]+num[bian[i,j]],i,bian[i,j]); for i:=1 to n do ans:=max2(ans,f[i],i); write(tou); tou:=trr[tou]; while tou<>0 do begin write('-',tou); tou:=trr[tou]; end; writeln; writeln(ans); end.
- 1
信息
- ID
- 801
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者