#二维dp
###扯淡
一道比较基本的入门难度的二维dp,类似于那道方格取数,不过走过一次的点下次不能再走(看提交记录里面好像走过一次的加一次a[i][j]的也AC了,,),我记得当年那道方格取数死活听不懂,最后自己硬是摸索出来了一个搜索加剪枝加贪心卡过去了。。现在看这道题感觉好简单。。。。
> 一直感觉自己的水平没什么太大的长进,突然回头一看,其实已经走过了好多路。
![路在脚下](http://s9.sinaimg.cn/bmiddle/a1f9c7efhbe6a767c1c58&690)
###言归正传
由于在题目中纸条传递的方向是没有意义的,所以直接考虑将两个纸条都从上往下传递,设dp[i][j][k][l]表示第一张纸条在(i,j),第二张在(k,l)时最大的好感度,更新如下:
dp[i][j][k][l] = max(dp[i-1][j][k-1][l], dp[i][j-1][k][l-1], dp[i-1][j][k][l-1], dp[i][j-1][k-1][l]) + a[i][j] + a[k][l]
**注意:要判断一下如果(i == k) 或 (j == l) (i-1 == k) ... 等情况发生时的处理方法,具体细节请自行思考或参见代码**
**由于(1,1) 和 (m,n) 需要走两次,可以考虑将起始点和终止点修改**

#include <cstdio>
#include <cstring>
#include <algorithm>
using std :: max;
const int maxn = 51;
int dp[maxn][maxn][maxn][maxn];
int a[maxn][maxn];
int m, n; int main () {
freopen("message.in", "r", stdin);
freopen("message.out", "w", stdout);
scanf("%d %d", &m, &n);
for (int i = 1; i <= m; i++)
for (int j = 1; j <= n; j++) {
scanf("%d", &a[i][j]);
}
dp[1][2][2][1] = a[1][2] + a[2][1];
for (int i = 1; i <= m; i++)
for (int j = 1; j <= n; j++)
for (int k = 1; k <= m; k++)
for (int l = 1; l <= n; l++) {
if (i == k && j == l) continue;
dp[i][j][k][l] = max(dp[i-1][j][k-1][l] + a[i][j] + a[k][l], dp[i][j][k][l]);
dp[i][j][k][l] = max(dp[i][j-1][k][l-1] + a[i][j] + a[k][l], dp[i][j][k][l]);
if (i-1 != k || j != l - 1)
dp[i][j][k][l] = max(dp[i][j][k][l], dp[i-1][j][k][l-1] + a[i][j] + a[k][l]);
if (j-1 != l || k-1 != i)
dp[i][j][k][l] = max(dp[i][j][k][l], dp[i][j-1][k-1][l] + a[i][j] + a[k][l]);
}
printf("%d\n", dp[m-1][n][m][n-1]);
return 0;
}

传纸条 NOIP2008 洛谷1006 二维dp的更多相关文章

  1. 洛谷1387 二维dp 不是特别简略的题解 智商题

    洛谷1387 dp题目,刚开始写的时候使用了前缀和加搜索,复杂度大概在O(n ^ 3)级别,感觉这么写还是比较对得起普及/提高-的难度的..后来看了题解区各位大神的题解,开始一脸mb,之后备受启发. ...

  2. 洛谷p1732 活蹦乱跳的香穗子 二维DP

    今天不BB了,直接帖原题吧  地址>>https://www.luogu.org/problem/show?pid=1732<< 题目描述 香穗子在田野上调蘑菇!她跳啊跳,发现 ...

  3. 洛谷P1048 采药 二维dp化一维

    题目描述 辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师.为此,他想拜附近最有威望的医师为师.医师为了判断他的资质,给他出了一个难题.医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个 ...

  4. 洛谷 P2015 二叉苹果树 (树上背包)

    洛谷 P2015 二叉苹果树 (树上背包) 一道树形DP,本来因为是二叉,其实不需要用树上背包来干(其实即使是多叉也可以多叉转二叉),但是最近都刷树上背包的题,所以用了树上背包. 首先,定义状态\(d ...

  5. 洛谷P1140 相似基因 (DP)

    洛谷P1140 相似基因 题目背景 大家都知道,基因可以看作一个碱基对序列.它包含了44种核苷酸,简记作A,C,G,TA,C,G,T.生物学家正致力于寻找人类基因的功能,以利用于诊断疾病和发明药物. ...

  6. HDU - 2159 FATE(二维dp之01背包问题)

    题目: ​ 思路: 二维dp,完全背包,状态转移方程dp[i][z] = max(dp[i][z], dp[i-1][z-a[j]]+b[j]),dp[i][z]表示在杀i个怪,消耗z个容忍度的情况下 ...

  7. 关于二维DP————站上巨人的肩膀

    意匠惨淡经营中ing, 语不惊人死不休........ 前几天学了DP,做了个简单的整理,记录了关于DP的一些概念之类的,今天记录一下刚学的一个类型 ----关于二维DP 那建立二维数组主要是干嘛用的 ...

  8. 洛谷1736(二维dp+预处理)

    洛谷1387的进阶版,但很像. 1387要求是“全为1的正方形”,取dp[i][j] = min(dp[i-1][j-1], min(dp[i-1][j], dp[i][j-1]))吧?这个有“只有对 ...

  9. 洛谷1387(基础二维dp)

    题目很简单,数据也很小,但是思路不妨借鉴:dp[i][j]代表以(i,j)为右下角的最长正方形边长. 类比一维里面设“以XX为结尾的最XXX(所求)”. 另外define不要乱用!尤其这种min套mi ...

随机推荐

  1. js 获取对象长度

    获取对象的程度,可以这样获取: var myObj = {a:1,b:2,c:3} var arr = Object.keys(myObj);var len = arr.length  console ...

  2. Codeforces 667B Coat of Anticubism

    链接:传送门 题意:题目balabala说了一大堆,然而并没什么卵用,给你n个数,将这个集合分割成两部分,构成三角形的两个边,让你求补充的那个边最短是多长 思路:三角形三边具有 a + b > ...

  3. 线性回归(regression)

    简介 回归分析只涉及到两个变量的,称一元回归分析.一元回归的主要任务是从两个相关变量中的一个变量去估计另一个变量,被估计的变量,称因变量,可设为Y:估计出的变量,称自变量,设为X. 回归分析就是要找出 ...

  4. django-9-请求与响应

    写在表单下面{% csrf_token %} <<<文件上传>>>settings.py UPLOAD_ROOT = os.paht.join(BASE_DIR, ...

  5. Nginx +Tomcat 实现动静态分离(转)

    Nginx +Tomcat 实现动静态分离 动静态分离就是Nginx处理客户端的请求的静态页面(html页面)或者图片,Tomcat处理客户端请求的动态页面(jsp页面),因为Nginx处理的静态页面 ...

  6. How to start/stop DB instance of Oracle under Linux

    All below actions should be executed with "oracle" user account 1. Check the status of lis ...

  7. jdk1.8Option类

    目的:为了解决一个方法返回的参数可能为空而无法传入到新的方法做参数的问题,java8产生了新的内容:Option. 定义:Option是一个可以为空的容器对象(注意本质上是个万能对象). 常用方法:1 ...

  8. IBM AppScan官方帮助文档错别字缺陷,IBM的測试人员也太粗心了吧

    袁术=元素?

  9. yolo环境配置

    主要配置参考官网https://pjreddie.com/darknet/yolo/ 为了能够可视化,另安装cuda+opencv cuda版本为9.0 opencv版本为3.1.0 先安装cuda再 ...

  10. BigDecimal相除异常

    使用两个BigDecimal类型的数字做除法运算时,出现了一个如下的异常信息: 1 java.lang.ArithmeticException: Non-terminating decimal exp ...