zoukankan      html  css  js  c++  java
  • SSL 1010——方格取数

    2000年分区联赛提高组之四 方格取数

    Time Limit:50000MS Memory Limit:65536K
    Total Submit:198 Accepted:112

    Description

      设有N*N的方格图(N<=10,我们将其中的某些方格中填入正整数,而其他的方格中则放入数字0。如下图所示(见样例):

    这里写图片描述

      某人从图的左上角的A 点出发,可以向下行走,也可以向右走,直到到达右下角的B点。在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字0)。
      此人从A点到B 点共走两次,试找出2条这样的路径,使得取得的数之和为最大。
    Input

      输入的第一行为一个整数N(表示N*N的方格图),接下来的每行有三个整数,前两个表示位置,第三个数为该位置上所放的数。一行单独的0表示输入结束。

    Output

      只需输出一个整数,表示2条路径上取得的最大的和。

    Sample Input

    8
    2 3 13
    2 6 6
    3 5 7
    4 4 14
    5 2 21
    5 6 4
    6 3 15
    7 2 14
    0 0 0
    Sample Output

    67


    设f[i][j][h][k]为第一条路径走到i,j;第二条路径走h,k。
    枚举八种情况,取最大值


    代码如下:

    #include<cstdio>
    #include<algorithm>    
    int a[51][51];                
    int sum[51][51][51][51];
    int n,i,j,h,k,x,y,z;
    using namespace std;
    int main()
    {
        int t1,t2;
        scanf("%d%d%d%d",&n,&x,&y,&z);
        while(x&&y&&z)
        {
            a[x][y]=z;
            scanf("%d%d%d",&x,&y,&z);
        }
        for(i=1;i<=n;i++)
            for(j=1;j<=n;j++)
                for(h=1;h<=n;h++)
                    for(k=1;k<=n;k++)
                    {
                        if(i+j==h+k)
                        {
                            t1=max(sum[i-1][j][h-1][k],sum[i][j-1][h][k-1]);
                            t2=max(sum[i-1][j][h][k-1],sum[i][j-1][h-1][k]);
                            sum[i][j][h][k]=max(t1,t2)+a[i][j];
                            if(i!=h&&j!=k)  sum[i][j][h][k]+=a[h][k];   
                        }
                    }
                    printf("%d",sum[n][n][n][n]);
                    return 0;
    }
  • 相关阅读:
    MySQL之pymysql模块
    MySQL之用户管理
    MySQL之正则
    MySQL之流程控制
    MySQL之备份恢复
    MySQL之函数
    安卓 adb命令
    js DOM事件
    js DOM
    js 流程控制语句
  • 原文地址:https://www.cnblogs.com/Comfortable/p/8412307.html
Copyright © 2011-2022 走看看