题意:

有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. VS2010程序打包操作

    摘录:http://www.cnblogs.com/daban/archive/2012/06/27/2565449.html   1.  在vs2010 选择“新建项目”----“其他项目类型”-- ...

  2. go语言实现遍历目录,及查找特定的文件类型

    // filelist.go package main import ( //"flag" "fmt" "os" "path/fi ...

  3. Java引用类型变量

    Java引用类型变量 1.编译时类型:由声明该变量时使用的类型决定 2.执行时类型:由实际赋给该变量的对象决定    类型不一致的假设编译时类型和执行,可能会出现多态性 版权声明:本文博主原创文章.博 ...

  4. effective c++ 条款3 use const whereever you can

    1 const 传达的意思应该是这个变量是常量不能更改 2 const 在 * 左边表示数据是const,在右边表示指针是const // char greeting[] = "hello& ...

  5. fullcalendar日历控件集合知识

    1.基本的语法: 首先,fullcalendar和JQUERY一样,以面向对象的方式来组织代码.当然,这里的面向对象不过指能够把整个fullcalendar理解为一个类,这个类里包含有非常多的属性.方 ...

  6. C++习题 对象数组求最大值

    Description 建立一个对象数组,内放n(<10)个学生的数据(学号.成绩),设立一个函数max,用指向对象的指针作函数参数,在max函数中找出n个学生中成绩最高者,并输出其学号. In ...

  7. android得知----overridePendingTransition

    1 Activity动画是指从一个切换activity跳到另一个activity随着电影. 它由两部分组成:第一部分是一个activity动画出口:中的第二个另一部分activity动画被访问: 于A ...

  8. webBrower控件实现winform和webpage交互

    添加WebBrowser控件 private WebBrowser webBrowser1; 引用页面的document对象 HtmlDocument doc = webBrowser1.Docume ...

  9. POJ3581:Sequence(后缀数组)

    Description Given a sequence, {A1, A2, ..., An} which is guaranteed A1 > A2, ..., An,  you are to ...

  10. Android 布局管理器

    为了更好地管理Android应用程序的用户界面组件,Android它提供了一个布局管理.通过使用布局管理,Android具有良好的平台无关的图形用户界面应用程序. 平时,推荐布局管理器来管理分布式组件 ...