zoukankan      html  css  js  c++  java
  • ny712 探寻宝藏 ny61 传纸条(1)

    探 寻 宝 藏

    时间限制:1000 ms  |  内存限制:65535 KB
    难度:5
    描述

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

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

    Dr.Kong希望他的机器人卡多尽量多地带出宝物。请你编写程序,帮助Dr.Kong计算一下,卡多最多能带出多少宝物。
    输入
    第一行: K 表示有多少组测试数据。
    接下来对每组测试数据:
    第1行: M N
    第2~M+1行: Ai1 Ai2 ……AiN (i=1,…..,m)


    【约束条件】
    2≤k≤5 1≤M, N≤50 0≤Aij≤100 (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
    
     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 using namespace std;
     5 int d[105][52][52],a[52][52];
     6 int main()
     7 {
     8     int x,i,j,k,t;
     9     int n,m;
    10     scanf("%d",&x);
    11     while(x--)
    12     {
    13         scanf("%d%d",&n,&m);
    14         memset(d,0,sizeof(d));
    15         for(i=1;i<=n;++i)
    16             for(j=1;j<=m;++j)
    17                 scanf("%d",&a[i][j]);
    18         for(k=3;k<n+m;k++)
    19             for(i=1;i<=n;++i)
    20                 for(j=i+1;j<=n;++j) //两条线 一定是一条比两一条的 横坐标要大
    21                 {
    22                     if(k-i<1||k-j<1) //有x+y=k知 y=k-x 故此处控制 列y的范围,下面同理
    23                         break;
    24                     if(k-i>m||k-j>m)
    25                         continue;
    26                     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]));
    27                                            //此处是5维的3维简略版,i和j不是坐标,而是两个移动坐标的 横坐标,由于纵坐标与横坐标是
    28                                            //线性函数关系,故可以省略。
    29                     d[k][i][j] +=a[i][k-i]+a[j][k-j];
    30                 }
    31         t=n+m;
    32         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]));
    33         printf("%d
    ",d[t][n][n]+a[n][m]);
    34     }
    35     return 0;
    36 }
    37         
  • 相关阅读:
    Android 开发 框架系列 OkHttp拦截器
    Android 开发 框架系列 OkHttp文件上传功能实现(含断点续传)
    Android 开发 框架系列 OkHttp使用详解
    Android 开发 框架系列 OkHttp文件下载功能实现(含断点续传)
    Git 如何使用ssh上传或者同步/下载项目到github
    Git 获取项目git clone
    System.arraycopy复制数组方法解释
    Android开发 AAC的ADTS头解析[转载]
    Android开发 多媒体提取器MediaExtractor详解_将一个视频文件分离视频与音频
    Android开发 多媒体提取器MediaExtractor详解_入门篇
  • 原文地址:https://www.cnblogs.com/lovychen/p/3614443.html
Copyright © 2011-2022 走看看