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 ...
随机推荐
- VS2010程序打包操作
摘录:http://www.cnblogs.com/daban/archive/2012/06/27/2565449.html 1. 在vs2010 选择“新建项目”----“其他项目类型”-- ...
- go语言实现遍历目录,及查找特定的文件类型
// filelist.go package main import ( //"flag" "fmt" "os" "path/fi ...
- Java引用类型变量
Java引用类型变量 1.编译时类型:由声明该变量时使用的类型决定 2.执行时类型:由实际赋给该变量的对象决定 类型不一致的假设编译时类型和执行,可能会出现多态性 版权声明:本文博主原创文章.博 ...
- effective c++ 条款3 use const whereever you can
1 const 传达的意思应该是这个变量是常量不能更改 2 const 在 * 左边表示数据是const,在右边表示指针是const // char greeting[] = "hello& ...
- fullcalendar日历控件集合知识
1.基本的语法: 首先,fullcalendar和JQUERY一样,以面向对象的方式来组织代码.当然,这里的面向对象不过指能够把整个fullcalendar理解为一个类,这个类里包含有非常多的属性.方 ...
- C++习题 对象数组求最大值
Description 建立一个对象数组,内放n(<10)个学生的数据(学号.成绩),设立一个函数max,用指向对象的指针作函数参数,在max函数中找出n个学生中成绩最高者,并输出其学号. In ...
- android得知----overridePendingTransition
1 Activity动画是指从一个切换activity跳到另一个activity随着电影. 它由两部分组成:第一部分是一个activity动画出口:中的第二个另一部分activity动画被访问: 于A ...
- webBrower控件实现winform和webpage交互
添加WebBrowser控件 private WebBrowser webBrowser1; 引用页面的document对象 HtmlDocument doc = webBrowser1.Docume ...
- POJ3581:Sequence(后缀数组)
Description Given a sequence, {A1, A2, ..., An} which is guaranteed A1 > A2, ..., An, you are to ...
- Android 布局管理器
为了更好地管理Android应用程序的用户界面组件,Android它提供了一个布局管理.通过使用布局管理,Android具有良好的平台无关的图形用户界面应用程序. 平时,推荐布局管理器来管理分布式组件 ...