neu1458 方格取数 dp解法
题意:
有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
- #include <cstdio>
- #include <ctime>
- #include <cstdlib>
- #include <cstring>
- #include <queue>
- #include <string>
- #include <set>
- #include <stack>
- #include <map>
- #include <cmath>
- #include <vector>
- #include <iostream>
- #include <algorithm>
- #include <bitset>
- #include <fstream>
- using namespace std;
- //LOOP
- #define FF(i, a, b) for(int i = (a); i < (b); ++i)
- #define FE(i, a, b) for(int i = (a); i <= (b); ++i)
- #define FED(i, b, a) for(int i = (b); i>= (a); --i)
- #define REP(i, N) for(int i = 0; i < (N); ++i)
- #define CLR(A,value) memset(A,value,sizeof(A))
- #define FC(it, c) for(__typeof((c).begin()) it = (c).begin(); it != (c).end(); it++)
- //OTHER
- #define SZ(V) (int)V.size()
- #define PB push_back
- #define MP make_pair
- #define all(x) (x).begin(),(x).end()
- //INPUT
- #define RI(n) scanf("%d", &n)
- #define RII(n, m) scanf("%d%d", &n, &m)
- #define RIII(n, m, k) scanf("%d%d%d", &n, &m, &k)
- #define RIV(n, m, k, p) scanf("%d%d%d%d", &n, &m, &k, &p)
- #define RV(n, m, k, p, q) scanf("%d%d%d%d%d", &n, &m, &k, &p, &q)
- #define RS(s) scanf("%s", s)
- //OUTPUT
- #define WI(n) printf("%d\n", n)
- #define WS(n) printf("%s\n", n)
- //debug
- //#define online_judge
- #ifndef online_judge
- #define dt(a) << (#a) << "=" << a << " "
- #define debugI(a) cout dt(a) << endl
- #define debugII(a, b) cout dt(a) dt(b) << endl
- #define debugIII(a, b, c) cout dt(a) dt(b) dt(c) << endl
- #define debugIV(a, b, c, d) cout dt(a) dt(b) dt(c) dt(d) << endl
- #define debugV(a, b, c, d, e) cout dt(a) dt(b) dt(c) dt(d) dt(e) << endl
- #else
- #define debugI(v)
- #define debugII(a, b)
- #define debugIII(a, b, c)
- #define debugIV(a, b, c, d)
- #endif
- #define sqr(x) (x) * (x)
- typedef long long LL;
- typedef unsigned long long ULL;
- typedef vector <int> VI;
- const double eps = 1e-9;
- const int MOD = 1000000007;
- const double PI = acos(-1.0);
- const int INF = 0x3f3f3f3f;
- const int maxn = 105;
- int dp[maxn][maxn][maxn];
- int w[maxn][maxn];
- int main()
- {
- //freopen("0.txt", "r", stdin);
- int n;
- while (~RI(n))
- {
- FE(i, 1, n) FE(j, 1, n) RI(w[i][j]);
- CLR(dp, 0);
- FE(i, 1, n)
- {
- FE(j, 1, n)
- {
- FE(k, 1, n)
- if (i + j >= k + 1 && i + j <= k + n)
- {
- int t = max(dp[i][j - 1][k - 1], dp[i][j - 1][k] )
- + (k == i ? w[i][j] : w[i][j] + w[k][i + j - k]);
- if (t > dp[i][j][k])
- dp[i][j][k] = t;
- t = max(dp[i - 1][j][k - 1], dp[i - 1][j][k])
- + (k == i ? w[i][j] : w[i][j] + w[k][i + j - k]);
- if (t > dp[i][j][k])
- dp[i][j][k] = t;
- }
- }
- }
- WI(dp[n][n][n]);
- }
- return 0;
- }
neu1458 方格取数 dp解法的更多相关文章
- NOIP2000方格取数[DP]
题目描述 设有N*N的方格图(N<=9),我们将其中的某些方格中填入正整数,而其他的方格中则放 人数字0.如下图所示(见样例): A 0 0 0 0 0 0 0 0 0 0 13 0 0 6 0 ...
- 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 ...
- P1006 传纸条 (方格取数dp)
题目描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个mm行nn列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸运 ...
- hiho 1617 - 方格取数 - dp
题目链接 描述 给定一个NxN的方格矩阵,每个格子中都有一个整数Aij.小Hi和小Ho各自选择一条从左上角格子到右下角格子的路径,要求路径中每一步只能向右或向下移动,并且两条路径不能相交(除了左上右下 ...
- hdu 3657 最大点权独立集变形(方格取数的变形最小割,对于最小割建图很好的题)
转载:http://blog.csdn.net/cold__v__moon/article/details/7924269 /* 这道题和方格取数2相似,是在方格取数2的基础上的变形. 方格取数2解法 ...
- HDU 1565 - 方格取数(1) - [状压DP][网络流 - 最大点权独立集和最小点权覆盖集]
题目链接:https://cn.vjudge.net/problem/HDU-1565 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32 ...
- HDU 1565&1569 方格取数系列(状压DP或者最大流)
方格取数(2) Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- HDU 1565 方格取数(1) 轮廓线dp
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1565 方格取数(1) Time Limit: 10000/5000 MS (Java/Others) ...
- HDU1565 方格取数 &&uva 11270 轮廓线DP
方格取数(1) Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
随机推荐
- IE7,8,9兼容性处理
在IE7根据假设高度文本框中设置,则光标将不会被中心的方法如以下: 添加属性,如:style="line-height:32px\9";能够 假设一个页面有多个TAB交换的物品.而 ...
- Android的第二次增加SurfaceView基本使用
本文来源于http://blog.csdn.net/hellogv/ ,引用必须注明出处. 上次介绍MediaPlayer的时候略微介绍了SurfaceView,SurfaceView因为能够直接从内 ...
- 网页信息抓取进阶 支持Js生成数据 Jsoup的不足之处
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/23866427 今天又遇到一个网页数据抓取的任务,给大家分享下. 说道网页信息抓取 ...
- BP神经网络的基本原理
2.1 BP神经网络基本原理 BP网络模型处理信息的基本原理是:输入信号Xi通过中间节点(隐层点)作用于输出节点.经过非线形变换,产生输出信号Yk,网络训练的每一个样本包含输入向量X和期望输出量t,网 ...
- sails 相关文章
Node 框架之sails http://cnodejs.org/topic/555c3c82e684c4c8088a0ca1
- LINK : fatal error LNK1181: 无法打开输入文件“..\..\lib\Release\opencv_ocl249.lib”
最近想要编译什么OpenCV资源.查看源代码调试执行. 按照网上的文章<Win7x64+VS2012+OpenCV2.4.3+CMake2.8.10+TBB41重编译OpenCV> 进行配 ...
- iOS开发- Xcode插件(一)-规范凝视生成器VVDocumenter
分享几个经常使用的Xcode插件. 第一个, 规范凝视生成器VVDocumenter. 顾名思义, 它能够非常方便的为你自己主动加入�凝视 使用效果例如以下: 下载链接:https://github. ...
- Android - 和其他APP交互 - 让其他app启动你的activity
前面的两篇文章主要讲了一个方面:从app中启动其他app.但是如果你的app可以处理对其他app有用的操作,你的app也应该响应其他app的操作请求.例如,如果你创建了一个社交app可以分享信息和图片 ...
- c# winform 中的 工具栏自动隐藏 splitter用法 带源码
c# winform 中的 工具栏自动隐藏 splitter用法 带源码 代码下载地址 http://download.csdn.net/detail/simadi/7649313
- EasyUI实战经验总结(转)
最近公司培训EasyUI,就做下总结吧,给有需要的人,源码在文章最后. 1.最常用的表格 ? 1 2 3 <div class="easyui-panel" data-opt ...