• 探寻宝藏--河南省第六届大学生程序设计竞赛


    题目描述

    传说HMH大沙漠中有一个M*N迷宫,里面藏有许多宝物。某天,Dr.Kong找到了迷宫的地图,他发现迷宫内处处有宝物,最珍贵的宝物就藏在右下角,迷宫的进出口在左上角。当然,迷宫中的通路不是平坦的,到处都是陷阱。Dr.Kong决定让他的机器人卡多去探险。

    但机器人卡多从左上角走到右下角时,只会向下走或者向右走。从右下角往回走到左上角时,只会向上走或者向左走,而且卡多不走回头路。(即:一个点最多经过一次)。当然卡多顺手也拿走沿路的每个宝物。

    Dr.Kong希望他的机器人卡多尽量多地带出宝物。请你编写程序,帮助Dr.Kong计算一下,卡多最多能带出多少宝物。

    输入

    第一行: K     表示有多少组测试数据。

    接下来对每组测试数据:

    1:       M   N

    2~M+1行: Ai1  Ai2 ……AiN    (i=1,..,m)

     

    2k5      1M, N50     0Aij100    (i=1,.,M; j=1,,N)

    所有数据都是整数。 数据之间有一个空格。

    输出

    对于每组测试数据,输出一行:机器人卡多携带出最多价值的宝物数

    样例输入

    2
    2 3
    0 10 10
    10 10 80
    3 3
    0 3 9
    2 8 5
    5 7 100

    样例输出

    120
    134

    d[k][x1][y1][x2][y2]={max(d[k-1][x1-1][y1][x2][y2-1],
                    d[k-1][x1-1][y1][x2-1][y2],
                    d[k-1][x1][y1-1][x2][y2-1],
                    d[k-1][x1][y1-1][x2-1][y2])
                  +a[x1][y1]+a[x2][y2];
                 };
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    int d[105][52][52],a[52][52];
    int main()
    {
        int x,i,j,k,t;
        int n,m;
        scanf("%d",&x);
        while(x--)
        {
            scanf("%d%d",&n,&m);
            memset(d,0,sizeof(d));
            for(i=1;i<=n;++i)
                for(j=1;j<=m;++j)
                    scanf("%d",&a[i][j]);
            for(k=3;k<n+m;k++)
                for(i=1;i<=n;++i)
                    for(j=i+1;j<=n;++j) //两条线 一定是一条比两一条的 横坐标要大
                    {
                        if(k-i<1||k-j<1) //有x+y=k知 y=k-x 故此处控制 列y的范围,下面同理
                            break;
                        if(k-i>m||k-j>m)
                            continue;
                        d[k][i][j] = max(max(d[k-1][i-1][j],d[k-1][i-1][j-1]),max(d[k-1][i][j-1],d[k-1][i][j]));
                                               //此处是5维的3维简略版,i和j不是坐标,而是两个移动坐标的 横坐标,
                                               //由于纵坐标与横坐标是
                                               //线性函数关系,故可以省略。
                        d[k][i][j] +=a[i][k-i]+a[j][k-j];
                    }
            t=n+m;
            d[t][n][n] = max(max(d[t-1][n-1][n],d[t-1][n-1][n-1]),max(d[t-1][n][n-1],d[n-1][n][n]));
            printf("%d
    ",d[t][n][n]+a[n][m]);
        }
        return 0;
    }
  • 相关阅读:
    【第一周】进度条
    【第二周】Java实现英语文章词频统计(改进1)
    【第二周】关于java.util包下的Random类
    【第二周】结对编程(宫丽君和林莉):四则运算
    【第二周】scrum站立会议
    【第二周】燃尽图
    【第二周】Java实现英语文章词频统计
    【第一周】读《构建之法》有感
    python:带参数的装饰器,函数的有用信息
    python:数据类型dict
  • 原文地址:https://www.cnblogs.com/zhengguiping--9876/p/4475620.html
Copyright © 2020-2023  润新知