题目:

蒜国地域是一个 n 行 m 列的矩阵,下标均从 1 开始。蒜国有个美丽的城堡,在坐标 (n,m) 上,蒜头君在坐标 (1,1) 的位置上。蒜头君打算出发去城堡游玩,游玩结束后返回到起点。在出发去城堡的路上,蒜头君只会选择往下或者往右走,而在返回的路上,蒜头君只会选择往上或者往左走,每次只能走一格。已知每个格子上都有一定数量的蒜味可乐,每个格子至多经过一次。
现在蒜头君请你来帮他计算一下,如何计划来回行程,可以收集到最多的蒜味可乐。

输入格式

第一行输入两个整数 n,m(1≤n,m≤50),表示蒜国是一个 n 行 m 列的矩阵。
接下来输入 n 行,每行输入 m 个整数,代表一个 n×m 的矩阵,每个整数代表对应位置上的蒜味可乐数量,每行的每两个整数之间用一个空格隔开。其中蒜头君的位置和城堡的位置上没有蒜味可乐,用 0 表示,其余位置上的整数范围在 [1,100] 内。

输出格式

输出一行,输出一个整数,表示蒜头君在来回路上能收集到的蒜味可乐的最大值。

样例输入

3 3
0 2 9
4 8 6
2 7 0

样例输出

36

分析:

(可以理解为从起点出发的不相交的两条路径)
首先,要注意一个问题:不能先算出去的最大值,再算返回的最大值。这样可能导致只保证了去的最大值,但没有保证来回之和的最大值。也就是说,来回的优先级是相同的,但是如果先算去路的最大值就会使得去的优先级高于回的优先级。
容易注意到本题的范围不大,所以可以用一个四维数组: f[i][j][k][l] 来表示路径1走到 [i][j] 和路径2走到 [k][l] 的和的最优值。
其中,因为走的步数相同,所以 i+j=k+l (可以利用这个等式来把空间和时间复杂度降一级),不难想到只要当前一步的两条路径没有走到用一个点,两条路径就不会相交(如果相交,重叠部分的可乐只能领取一次,就不是最优情况)。
最后就不难写出动规方程:  f[i][j][k][l] = max(max(f[i-1][j][k-1][l], f[i][j-1][k-1][l]), max(f[i-1][j][k][l-1], f[i][j-1][k][l-1]))+map[i][j]+map[k][l]; 其中第一部分是求两个路径当前点的两个前趋情况的和的最大值(一共是 2×2 四种情况,所以用了一个 max 套两个 max)。
最最后,因为两条路径在终点还是会交于一点,所以千万不能输出 f[n][m][n][m] ,应该输出 f[n-1][m][n][m-1] 。

标程:

 1 #include <iostream>2 #include <cstdlib>3 #include <cstring>4 using namespace std;5 int n,m,map[55][55],f[55][55][55][55];6 int main()7 {8     memset(f,0,sizeof(f));9     cin >> n >> m;
10     for (int i=1; i<=n; i++)
11     {
12         for (int j=1; j<=m; j++)
13         {
14             cin >> map[i][j];
15         }
16     }
17     for (int i=1; i<=n; i++)
18     {
19         for (int j=1; j<=m; j++)
20         {
21             for (int k=1; k<=n; k++)
22             {
23                 for (int l=1; l<=m; l++)
24                 {
25                     if (i+j!=k+l)
26                         continue;
27                     if (i==k && j==l)
28                         continue;
29                     f[i][j][k][l] = max(max(f[i-1][j][k-1][l], f[i][j-1][k-1][l]), max(f[i-1][j][k][l-1], f[i][j-1][k][l-1]))
30                     +map[i][j]+map[k][l];
31                 }
32             }
33         }
34     }
35     cout << f[n-1][m][n][m-1] << endl;
36     return 0;
37 }

转载于:https://www.cnblogs.com/passion-sky/p/8490088.html

61计蒜客 动态规划基础 蒜头君的城堡之旅相关推荐

  1. 计蒜客c语言 蒜头君招聘程序,计蒜客 数据结构 蒜头君筛选用户

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 测试了很多样例都是对的 但一直过不去 求大神( ⊙ o ⊙ )啊! #include #include using namespace std; clas ...

  2. 计蒜客 -- 常用STL题解

    1.计蒜客 – 打印锯齿矩阵 问题描述 锯齿矩阵是指每一行包含的元素个数不相同的矩阵,比如: 3 5 2 6 1 2 3 4 1 6 2 7 读入若干对整数 (x,y),表示在第 x 行的末尾加上一个 ...

  3. 计蒜客 - 蒜头君的任务

    计蒜客 蒜头君的任务 题目描述 蒜头君的上司给蒜头君布置了一个任务,蒜头君维护一个数列,要求提供以下两种操作: 查询操作. 语法:Q L 功能:查询当前数列中末尾 L L L 个数中的最大的数,并输出 ...

  4. [计蒜客(蓝桥杯省赛)]蒜头君的购物袋2

    题目来源 计蒜客程序设计竞赛基础课(蓝桥杯省赛) 算法标签 DP 题目描述 思路 01背包模板 题目代码 #include<iostream> #include<climits> ...

  5. 计蒜客一月入门赛:《三个火枪手》题解

    题目链接(https://nanti.jisuanke.com/t/52314) 有 n 个人,其中有 m 对相互认识的关系. 一个人的知名度定义为 有多少人 和他相互认识. 现在蒜头君需要从这 n ...

  6. 计算二进制补码 计蒜客 Python

    题目 题目来源于计蒜客输出二进制补码 题目描述 蒜头君有一个 int 的整数,输出它的 32 位二进制补码. 输入格式 一个整型整数. 输出格式 输出一行,即该整数的补码表示. 样例输入 7 样例输出 ...

  7. 计蒜客 T1853:非常男女(前缀和)

    上一篇博客计蒜客 T1101:大整数的因子(高精度除法详解)  写在前面:大家好!我是ACfun,我的昵称来自两个单词Accepted和fun.我是一个热爱ACM的蒟蒻.这篇博客来记录一下计蒜客T18 ...

  8. 计蒜客题解——T1244:单词序列

    题目相关 题目链接 计蒜客 OJ,https://nanti.jisuanke.com/t/T1244. 我的 OJ,http://47.110.135.197/problem.php?id=4766 ...

  9. 计蒜客题解——T1414:抠图

    题目相关 题目链接 计蒜客,https://nanti.jisuanke.com/t/T1414. 我的 OJ,http://47.110.135.197/problem.php?id=4768. 题 ...

最新文章

  1. 读“基于深度学习的图像识别技术研究综述”有感
  2. mSystems:华中农大郝秀丽组发现稀有/丰富微生物类群对镉污染土壤改良剂的不同反应!...
  3. c语言中fflush的运用为什么没有效果呢,测试平台linux
  4. 小技巧textbox的行数
  5. 默认标题栏字体_不喜欢Windows10上的默认系统字体,可以这样更改
  6. String 与StringBuilder
  7. 在使用flask下载文件时会出现的一个文件下载不到的问题
  8. 遇到的Ajax相关问题
  9. 【BIOS大全】释义+设置+精解+释疑————玩转电脑必备工具帖(8)
  10. python面向对象(3)
  11. 几个超级实用但很少人知道的 VS 技巧[更新]
  12. dedecms--在后台增加会员添加
  13. HTML元素(标签)大全及使用说明 (整)
  14. 项目管理之我见:程序开发步骤
  15. 如何成为Emacs高手,像神一样使用编辑器
  16. 韦东山嵌入式Linux三大学习路线
  17. Taro 周报 #7: 收获「e代驾」案例,发布 v2.2.16 和 v3.2.0-canary.2
  18. 调用微软小冰API,实现批量人脸颜值打分
  19. Bootstrap系列之下拉菜单(Dropdowns)
  20. 危机四伏,卡士酸奶的高端人设还立得住吗?

热门文章

  1. 科学计算机撤销,云计算环境下基于属性的撤销方案-计算机科学.PDF
  2. python大一知识点_python知识点复习
  3. 龙岗网络推广解析有关网站SEO排名上去了,但没实际性点击的问题
  4. 网络营销——网络营销专员浅析网站快照更新要点
  5. mysql 显示用户_在Mysql中如何显示所有用户?
  6. python的100个案例_Python实例100个(基于最新Python3.7版本)
  7. mysql凡人入门_3种PHP连接MYSQL数据库的常用方法
  8. itunes未能连接到iphone_FonePaw iPhone Data Recovery mac版(iphone数据恢复工具)
  9. python勾股定理_Python学习第128课——在Python中实现醉汉随机游走
  10. android从放弃到精通 第八天 freedom