来自:http://www.cnblogs.com/DSChan/p/4862019.html

题目说找来回两条不相交路径,其实也可以等价为从(1,1)到(n,m)的两条不相交路径。

如果是只找一条,那又回到了最经典的 dp[i][j] = max(dp[i-1][j],dp[i][j-1]) + a[i][j]。

现在找两条,可以先把数组开到四维。

dp[x1][y1][x2][y2] = max{

dp[x1][y1-1][x2][y2-1],

dp[x1-1][y1][x2-1][y2],

dp[x1-1][y1][x2][y2-1],

dp[x1][y1-1][x2-1][y2]

}

+ a[x1][y1] + a[x2][y2]

要两条路径不能相交,也就是dp[x][y][x][y]属于非法状态,判断一下不能经过此状态即可。

最简单的方法是令x2>x1,因为dp[x1][y1][x2][y2]与dp[x2][y2][x1][y1]是等价的。

由于m和n最大到50,开四维的数组太大,当中有很多重复和浪费。

脑补一下,两张纸条同时传的话,同一时刻它们穿过的人数是相同的,根据这点可以进行降维。

令d[i][x1][x2]表示第i步两张纸条的x坐标分别是x1和x2,则y1=i-x1+2,y2=i-x2+2。

这样就可以得出dp方程

d[i][x1][x2] = max{ d[i-1][x1][x2], d[i-1][x1-1][x2], d[i-1][x1][x2-1], d[i-1][x1-1][x2-1] } + a[x1][i-x1+2] + a[x2][i-x2+2]

注意答案d[n+m-2][n][n]要特算(因为这属于"不合法状态")

  1. #include<iostream>
  2. #include<cassert>
  3. #include<cstdio>
  4. #include<cstring>
  5. #include<algorithm>
  6. #include<cmath>
  7. #include<string>
  8. #include<iterator>
  9. #include<cstdlib>
  10. #include<vector>
  11. #include<stack>
  12. #include<map>
  13. #include<set>
  14. using namespace std;
  15. #define rep(i,f,t) for(int i = (f),_end_=(t); i <= _end_; ++i)
  16. #define rep2(i,f,t) for(int i = (f),_end_=(t); i < _end_; ++i)
  17. #define dep(i,f,t) for(int i = (f),_end_=(t); i >= _end_; --i)
  18. #define dep2(i,f,t) for(int i = (f),_end_=(t); i > _end_; --i)
  19. #define clr(c, x) memset(c, x, sizeof(c) )
  20. typedef long long int64;
  21. const int INF = 0x5f5f5f5f;
  22. const double eps = 1e-8;
  23. //*****************************************************
  24. int d[100][55][55];
  25. int a[55][55];
  26. inline int max(int i,int j,int k,int l)
  27. {
  28. return max(max(i,j),max(k,l));
  29. }
  30. int main()
  31. {
  32. int n,m;
  33. scanf("%d%d",&n,&m);
  34. rep(i,1,n)rep(j,1,m)scanf("%d",&a[i][j]);
  35. rep(i,1,n+m-2)rep(x1,max(1,i+2-m),min(n,i+1))
  36. {
  37. int y1 = i - x1 + 2;
  38. rep(x2,max(x1+1,i+2-m), min(n,i+1))
  39. {
  40. int y2 = i - x2 + 2;
  41. d[i][x1][x2] = max(d[i-1][x1-1][x2-1], d[i-1][x1][x2-1],
  42. d[i-1][x1-1][x2],d[i-1][x1][x2])
  43. + a[x1][y1] + a[x2][y2];
  44. }
  45. }
  46. d[n+m-2][n][n] = d[n+m-3][n-1][n];
  47. cout<<d[n+m-2][n][n]<<endl;   //直接输出d[n+m-3][n-1][n]即可
  48. return 0;
  49. }

code1169 传纸条的更多相关文章

  1. tyvj1011 传纸条

    背景 NOIP2008复赛提高组第三题 描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端, ...

  2. NOIP2008 传纸条

    题目描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸运的是 ...

  3. NOIP2008传纸条[DP]

    题目描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸运的是 ...

  4. NOIP2008 T3 传纸条 解题报告——S.B.S.

    题目描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸运的是 ...

  5. [NOIP2008] 提高组 洛谷P1006 传纸条

    题目描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸运的是 ...

  6. TYVJ 1011 NOIP 2008&&NOIP 2000 传纸条&&方格取数 Label:多线程dp

    做题记录:2016-08-15 15:47:07 背景 NOIP2008复赛提高组第三题 描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行 ...

  7. nyoj 61 传纸条

    点击打开链接 传纸条(一) 时间限制:2000 ms  |  内存限制:65535 KB 难度:5 描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做 ...

  8. P1011 传纸条//dp优化改进状态表示

    P1011 传纸条 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 NOIP2008复赛提高组第三题 描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不 ...

  9. Wikioi 1169 传纸条

    这道题是我人生第一道双线动规题,因此我觉得还是很有必要记录下来. 刚接触到这道题的时候我第一反应是单线的动规,可是下一秒我就觉得这样做可能会有问题,因为从左上角(以下简称A)到右下角(以下简称B)通过 ...

随机推荐

  1. ubuntu :扩充虚拟机的磁盘容量

    前言: 开始建立虚拟机的时候给的容量是20G,给了10G的交换空间,所以后来有点不够用了,现在安装软件会出现提示磁盘空间不足,所以需要扩充一下磁盘的容量. 步骤:     1.因为我用的是Vmware ...

  2. jmeter踩坑系列

    1.踩坑系列一: 抓包出来有host的字段,放到jmeter里面一起请求就报错了,去掉就请求正常了 1.踩坑系列二: 从花瓶复制过去 的values 前面有空格,肉眼看起来没有

  3. 1095 Cars on Campus

    题意:给出N量车的车牌号,进出的时间,进/出状态.然后给出若干个查询,要求计算在每一查询时刻校园内停着的汽车数量,最后输出这一天中停放时间最长的车辆(若车不止一辆,则按字典序输出)以及停放时间.注:查 ...

  4. C语言实现Base64编码/解码

    Bse64是一种以64个可打印字符对二进制数据进行编码的编码算法.base64在对数据进行编码时以三个8位字符型数据为一组,取这三个字符型数据的ASCII码,然后以6位为一组组成4个新的数据,这4个新 ...

  5. mysql导出文本文件,加分隔符

    从mysql导出,再导入到oracle #!/bin/sh cd /u03/tools/machine_info rm -f data/machine_info.txt mysql -u用户名 -p密 ...

  6. Vue源码(一)

    入口文件 src/core/instance/index.js 中可以看到 function Vue (options) { if (process.env.NODE_ENV !== 'product ...

  7. EasyUI介绍及常见问题

    JQuery Easy UI介绍 1.JQuery Easy UI环境搭建和调试: https://jingyan.baidu.com/article/67508eb4342f9f9cca1ce426 ...

  8. Django学习---CSRF

    CSRF xss攻击:假设我们网站的评论里面允许用户写js的时候,每个人就会看到页面会执行这个js代码,有的是alert,不停的跳出弹框.这个还不算严重的,关键是如果js代码运行的结果不显示在页面上, ...

  9. 关于1.0.0版Backbone.js调用validate

    网上的调用这个方法的例子都是老版本的,新版本的调用方法有所变化,首先错误绑定事件error换成了invalid,其次设置数据时应传入{validate: true} var Chapter = Bac ...

  10. Python实践练习:多重剪贴板

    题目 假定你有一个无聊的任务,要填充一个网页或软件中的许多表格,其中包含一些文本字段.剪贴板让你不必一次又一次输入同样的文本,但剪贴板上一次只有一个内容.如果你有几段不同的文本需要拷贝粘贴,就不得不一 ...