1 条题解

  • 0
    @ 2025-2-14 21:20:41

    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
    上传者