1 条题解

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

    C++ :

    //方法一:四维
    #include<bits/stdc++.h>
    using namespace std;
    
    int dp[12][12][12][12],a[12][12];
    int main()
    {
    	int n,x,y,z;
    	cin>>n;
    	while(cin>>x>>y>>z&&x&&y&&z){
    		a[x][y]=z;
    	}
    	for(int x1=1; x1<=n; x1++){
    		for(int y1=1; y1<=n; y1++){
    			for(int x2=1; x2<=n; x2++){
    				for(int y2=1; y2<=n; y2++){
    					dp[x1][y1][x2][y2]=max(dp[x1-1][y1][x2-1][y2],
    					                   max(dp[x1-1][y1][x2][y2-1],
    									   max(dp[x1][y1-1][x2-1][y2],
                                           dp[x1][y1-1][x2][y2-1])))
                                           +a[x1][y1]+a[x2][y2];
    					if(x1==x2&&y1==y2){
    						dp[x1][y1][x2][y2]-=a[x1][y1];//多加了1次 
    					} 
    				}
    			}
    		}
    	}
    	cout<<dp[n][n][n][n]<<endl; 
    	return 0;
    }
    
    /*分析
    状态:dp[x1][y1][x2][y2](一个走到x1,y1,一个走到x2,y2的最大路径和)
    转移方程:
    dp[x1][y1][x2][y2]=max(dp[x1-1][y1][x2-1][y2],
    				   max(dp[x1-1][y1][x2][y2-1],
    		           max(dp[x1][y1-1][x2-1][y2],
                           dp[x1][y1-1][x2][y2-1])))
                            +a[x1][y1]+a[x2][y2]; 
    边界值:无
    计算顺序 dp[1..n][1...n]从小到大
    答案:dp[n][n][n][n]
    */
    

    Pascal :

    program fgqs;
    var a:array[0..100,0..100] of longint;
        f:array[0..100,0..100,0..100] of longint;
        i,j,n,x,y,t:longint;
    function max(b,c,d,e:longint):longint;
    begin
      if c>b then b:=c;
      if d>b then b:=d;
      if e>b then b:=e;
      exit(b);
    end;
    begin
     { assign(input,'fgqs.in');
      assign(output,'fgqs.out');
      reset(input);
      rewrite(output);}
      readln(n);
      readln(x,y,t);
      while (x<>0) and (y<>0) and (t<>0) do
      begin
      a[x,y]:=t;
        readln(x,y,t);
      end;
      f[1,1,1]:=a[1,1];
      for i:=2 to n+n-1 do
        for x:=1 to n do
          for y:=1 to n do
            if (i+1-x>0) and (i+1-y>0) then
            begin
              f[i,x,y]:=max(f[i-1,x-1,y],f[i-1,x-1,y-1],f[i-1,x,y-1],f[i-1,x,y]);
              if x<>y then
              f[i,x,y]:=f[i,x,y]+a[x,i+1-x]+a[y,i+1-y];
              if x=y then
              f[i,x,y]:=f[i,x,y]+a[x,i+1-x];
            end;
      writeln(f[n+n-1,n,n]);
      {close(input);
      close(output);}
    end.
    
    • 1

    信息

    ID
    825
    时间
    1000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者