题意:

有N * N个格子,每一个格子里有正数或者0,从最左上角往最右下角走,仅仅能向下和向右,一共走两次(即从左上角走到右下角走两趟),把全部经过的格子的数加起来,求最大值SUM,且两次假设经过同一个格子,则最后总和SUM中该格子的计数仅仅加一次。



走两次,所以状态表示要同一时候表示两次路径。dp[i][j][k][l] 表示第一次走到i,  j,第二次走到k, l得到的最大值,这里i + j == k + l

事实上第四维是能够通过前三维算出来的,所以能够去掉

那么dp[i][j][k] 能够通过四种状态转移,(i, j - 1, k)  (i,  j - 1, k - 1) (i - 1,  j,  k) (i - 1, j, k - 1)即两次都能够选择是从上或者左边移动过来

由于i + j == k + l,所以 i + j - k是l 的位置,1 <= l <= n,即 i + j <= k + n && i + j >= k + 1 

  1. #include <cstdio>
  2. #include <ctime>
  3. #include <cstdlib>
  4. #include <cstring>
  5. #include <queue>
  6. #include <string>
  7. #include <set>
  8. #include <stack>
  9. #include <map>
  10. #include <cmath>
  11. #include <vector>
  12. #include <iostream>
  13. #include <algorithm>
  14. #include <bitset>
  15. #include <fstream>
  16. using namespace std;
  17. //LOOP
  18. #define FF(i, a, b) for(int i = (a); i < (b); ++i)
  19. #define FE(i, a, b) for(int i = (a); i <= (b); ++i)
  20. #define FED(i, b, a) for(int i = (b); i>= (a); --i)
  21. #define REP(i, N) for(int i = 0; i < (N); ++i)
  22. #define CLR(A,value) memset(A,value,sizeof(A))
  23. #define FC(it, c) for(__typeof((c).begin()) it = (c).begin(); it != (c).end(); it++)
  24. //OTHER
  25. #define SZ(V) (int)V.size()
  26. #define PB push_back
  27. #define MP make_pair
  28. #define all(x) (x).begin(),(x).end()
  29. //INPUT
  30. #define RI(n) scanf("%d", &n)
  31. #define RII(n, m) scanf("%d%d", &n, &m)
  32. #define RIII(n, m, k) scanf("%d%d%d", &n, &m, &k)
  33. #define RIV(n, m, k, p) scanf("%d%d%d%d", &n, &m, &k, &p)
  34. #define RV(n, m, k, p, q) scanf("%d%d%d%d%d", &n, &m, &k, &p, &q)
  35. #define RS(s) scanf("%s", s)
  36. //OUTPUT
  37. #define WI(n) printf("%d\n", n)
  38. #define WS(n) printf("%s\n", n)
  39. //debug
  40. //#define online_judge
  41. #ifndef online_judge
  42. #define dt(a) << (#a) << "=" << a << " "
  43. #define debugI(a) cout dt(a) << endl
  44. #define debugII(a, b) cout dt(a) dt(b) << endl
  45. #define debugIII(a, b, c) cout dt(a) dt(b) dt(c) << endl
  46. #define debugIV(a, b, c, d) cout dt(a) dt(b) dt(c) dt(d) << endl
  47. #define debugV(a, b, c, d, e) cout dt(a) dt(b) dt(c) dt(d) dt(e) << endl
  48. #else
  49. #define debugI(v)
  50. #define debugII(a, b)
  51. #define debugIII(a, b, c)
  52. #define debugIV(a, b, c, d)
  53. #endif
  54.  
  55. #define sqr(x) (x) * (x)
  56. typedef long long LL;
  57. typedef unsigned long long ULL;
  58. typedef vector <int> VI;
  59. const double eps = 1e-9;
  60. const int MOD = 1000000007;
  61. const double PI = acos(-1.0);
  62. const int INF = 0x3f3f3f3f;
  63. const int maxn = 105;
  64.  
  65. int dp[maxn][maxn][maxn];
  66. int w[maxn][maxn];
  67.  
  68. int main()
  69. {
  70. //freopen("0.txt", "r", stdin);
  71. int n;
  72. while (~RI(n))
  73. {
  74. FE(i, 1, n) FE(j, 1, n) RI(w[i][j]);
  75. CLR(dp, 0);
  76. FE(i, 1, n)
  77. {
  78. FE(j, 1, n)
  79. {
  80. FE(k, 1, n)
  81. if (i + j >= k + 1 && i + j <= k + n)
  82. {
  83. int t = max(dp[i][j - 1][k - 1], dp[i][j - 1][k] )
  84. + (k == i ? w[i][j] : w[i][j] + w[k][i + j - k]);
  85. if (t > dp[i][j][k])
  86. dp[i][j][k] = t;
  87. t = max(dp[i - 1][j][k - 1], dp[i - 1][j][k])
  88. + (k == i ? w[i][j] : w[i][j] + w[k][i + j - k]);
  89. if (t > dp[i][j][k])
  90. dp[i][j][k] = t;
  91. }
  92. }
  93. }
  94. WI(dp[n][n][n]);
  95. }
  96. return 0;
  97. }

neu1458 方格取数 dp解法的更多相关文章

  1. NOIP2000方格取数[DP]

    题目描述 设有N*N的方格图(N<=9),我们将其中的某些方格中填入正整数,而其他的方格中则放 人数字0.如下图所示(见样例): A 0 0 0 0 0 0 0 0 0 0 13 0 0 6 0 ...

  2. luogu 1004 方格取数 dp

    题目链接 题意 设有N*N的方格图(N<=9),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字0.如下图所示: A 0 0 0 0 0 0 0 0 0 0 13 0 0 6 0 0 ...

  3. P1006 传纸条 (方格取数dp)

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

  4. hiho 1617 - 方格取数 - dp

    题目链接 描述 给定一个NxN的方格矩阵,每个格子中都有一个整数Aij.小Hi和小Ho各自选择一条从左上角格子到右下角格子的路径,要求路径中每一步只能向右或向下移动,并且两条路径不能相交(除了左上右下 ...

  5. hdu 3657 最大点权独立集变形(方格取数的变形最小割,对于最小割建图很好的题)

    转载:http://blog.csdn.net/cold__v__moon/article/details/7924269 /* 这道题和方格取数2相似,是在方格取数2的基础上的变形. 方格取数2解法 ...

  6. HDU 1565 - 方格取数(1) - [状压DP][网络流 - 最大点权独立集和最小点权覆盖集]

    题目链接:https://cn.vjudge.net/problem/HDU-1565 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32 ...

  7. HDU 1565&1569 方格取数系列(状压DP或者最大流)

    方格取数(2) Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  8. HDU 1565 方格取数(1) 轮廓线dp

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1565 方格取数(1) Time Limit: 10000/5000 MS (Java/Others) ...

  9. HDU1565 方格取数 &&uva 11270 轮廓线DP

    方格取数(1) Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

随机推荐

  1. IE7,8,9兼容性处理

    在IE7根据假设高度文本框中设置,则光标将不会被中心的方法如以下: 添加属性,如:style="line-height:32px\9";能够 假设一个页面有多个TAB交换的物品.而 ...

  2. Android的第二次增加SurfaceView基本使用

    本文来源于http://blog.csdn.net/hellogv/ ,引用必须注明出处. 上次介绍MediaPlayer的时候略微介绍了SurfaceView,SurfaceView因为能够直接从内 ...

  3. 网页信息抓取进阶 支持Js生成数据 Jsoup的不足之处

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/23866427 今天又遇到一个网页数据抓取的任务,给大家分享下. 说道网页信息抓取 ...

  4. BP神经网络的基本原理

    2.1 BP神经网络基本原理 BP网络模型处理信息的基本原理是:输入信号Xi通过中间节点(隐层点)作用于输出节点.经过非线形变换,产生输出信号Yk,网络训练的每一个样本包含输入向量X和期望输出量t,网 ...

  5. sails 相关文章

    Node 框架之sails   http://cnodejs.org/topic/555c3c82e684c4c8088a0ca1

  6. LINK : fatal error LNK1181: 无法打开输入文件“..\..\lib\Release\opencv_ocl249.lib”

    最近想要编译什么OpenCV资源.查看源代码调试执行. 按照网上的文章<Win7x64+VS2012+OpenCV2.4.3+CMake2.8.10+TBB41重编译OpenCV> 进行配 ...

  7. iOS开发- Xcode插件(一)-规范凝视生成器VVDocumenter

    分享几个经常使用的Xcode插件. 第一个, 规范凝视生成器VVDocumenter. 顾名思义, 它能够非常方便的为你自己主动加入�凝视 使用效果例如以下: 下载链接:https://github. ...

  8. Android - 和其他APP交互 - 让其他app启动你的activity

    前面的两篇文章主要讲了一个方面:从app中启动其他app.但是如果你的app可以处理对其他app有用的操作,你的app也应该响应其他app的操作请求.例如,如果你创建了一个社交app可以分享信息和图片 ...

  9. c# winform 中的 工具栏自动隐藏 splitter用法 带源码

    c# winform 中的 工具栏自动隐藏 splitter用法 带源码 代码下载地址 http://download.csdn.net/detail/simadi/7649313

  10. EasyUI实战经验总结(转)

    最近公司培训EasyUI,就做下总结吧,给有需要的人,源码在文章最后. 1.最常用的表格 ? 1 2 3 <div class="easyui-panel" data-opt ...