hiho 1617 - 方格取数 - dp
描述
给定一个NxN的方格矩阵,每个格子中都有一个整数Aij。小Hi和小Ho各自选择一条从左上角格子到右下角格子的路径,要求路径中每一步只能向右或向下移动,并且两条路径不能相交(除了左上右下起止方格)。
现在将两条路径经过的整数加起来求和。你能计算出这个和最大是多少吗?
输入
第一行包含一个整数N。
以下N行每行包含N个整数,代表方格矩阵中的数字。
对于50%的数据,1 ≤ N ≤ 50
对于100%的数据,1 ≤ N ≤ 200 1 ≤ Aij ≤ 100
---------------------------------------------------------------------------------------------------------------------------------------------
如下图那样一行行的处理
dp[row][i][j]代表 第row行选取第i和第j个元素时的最大值,
dp[row][i][j]最多只和上一行的四个元素相关,注意上三角和下三角这四个元素的索引方式不同。
因为第row行只和第row-1行相关,所以只需保存前一行的结果。
- #include <cstdio>
- #include <cstring>
- #include <iostream>
- #include <algorithm>
- using namespace std;
- const int N = ;
- int dp[N][N][];
- int A[N][N];
- int n;
- int get(int row,int i){
- if(row<=n+){
- if(i>=row) return ;
- return A[row-i][i];
- }
- else{
- int x = row-n-+i;
- if(x>n) return ;
- return A[row-x][x];
- }
- }
- int main(){
- cin>>n;
- for(int i=;i<=n;i++) for(int j=;j<=n;j++) scanf("%d",&A[i][j]);
- memset(dp,,sizeof(dp));
- dp[][][] = A[][]*;
- int cur = ;
- for(int row=;row<n*;row++){
- int cnt = (row>n+)?(n*-row++):(row);
- int gap = (row>n+)? : -;
- for(int i=;i<cnt;i++) for(int j=i+;j<cnt;j++){
- int max1 = std::max(dp[i][j][!cur],dp[i+gap][j][!cur]);
- int max2 = std::max(dp[i][j+gap][!cur],dp[i+gap][j+gap][!cur]);
- dp[i][j][cur] = std::max(max1,max2)+get(row,i)+get(row,j);
- }
- cur = cur?:;
- }
- printf("%d\n",dp[][][!cur]+A[n][n]*);
- return ;
- }
hiho 1617 - 方格取数 - dp的更多相关文章
- hihocoder #1617 : 方格取数(dp)
题目链接:http://hihocoder.com/problemset/problem/1617 题解:一道递推的dp题.这题显然可以考虑两个人同时从起点出发这样就不会重复了设dp[step][i] ...
- 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列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸运 ...
- HihoCoder - 1617 方格取数
HihoCoder - 1617 (从群主那里借鉴来的, 群主好强啊) 题意:中文题不解释... 题解: dp[X][i][j] 代表的是X是坐标之和 第一个人 走到位置 dp[i][x-i] 第二个 ...
- neu1458 方格取数 dp解法
题意: 有N * N个格子,每一个格子里有正数或者0,从最左上角往最右下角走,仅仅能向下和向右,一共走两次(即从左上角走到右下角走两趟),把全部经过的格子的数加起来,求最大值SUM,且两次假设经过同一 ...
- 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][网络流 - 最大点权独立集和最小点权覆盖集]
题目链接:https://cn.vjudge.net/problem/HDU-1565 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32 ...
- HDU 1565 方格取数(1) 轮廓线dp
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1565 方格取数(1) Time Limit: 10000/5000 MS (Java/Others) ...
随机推荐
- c# post方式请求java form表单api
using System; using System.Collections.Generic; using System.Net.Http; namespace ConsoleApplication1 ...
- 【转】解析<button>和<input type="button"> 的区别
一.定义和用法 <button> 标签定义的是一个按钮. 在 button 元素内部,可以放置文本或图像.这是<button>与使用 input 元素创建的按钮的不同之处. 二 ...
- Windows下Java JDK安装和环境变量配置
[Java攻城狮学习路线](http://www.cnblogs.com/apollospotatolikett/p/8665123.html 1.JDK下载 下载地址:http://www.orac ...
- hook的本质就是在本原可执行文件中加东西
hook的本质就是在本原可执行文件中加东西. 本质就是添加东西:
- ZBrush曲线功能介绍
在ZBrush®中曲线功能是一个非常有用的工具.插入笔刷,曲线笔刷,拓扑和许多地方都会用到它.生成曲线的方式有很多种.可以使用重拓扑引导线,可以使用笔触菜单下曲线功能中的框架网格,可以使用ZBrush ...
- C# 基础复习 三 XML操作
XML 可扩展标记语言(所有标签都是自己定义,没有固定格式) 如果要给XML规定格式,可以使用dtd (dtd是什么?你不会自己百度吗) XML主要用来存储数据 XML的要求: 根节点只能有一 ...
- Python学习笔记(6)元组
2019-03-02 元组(tuple): (1)元组是不可变的,无法进行任意修改.插入.删除一个元素. (2)创建元组大部分时候用小括号,如果创建的元组中只有一个元素,需要在它的后面加上一个逗号. ...
- 小学生都能学会的python(运算符 和 while循环)
---恢复内容开始--- 小学生都能学会的python(运算符和编码) 一.格式化输出 #占位:"%s"占位,占得是字符串,"%d"占位,占的是数字. # 让用 ...
- MyEclipse报错Access restriction: The type BASE64Encoder is not accessible due to restriction on required library
错误截图: 解决办法: 1.进入Project --> Properties --> Java Build Path --> Libraries 2.remove 掉 JRE Sys ...
- Objective-C 和 Core Foundation 对象相互转换
iOS同意Objective-C 和 Core Foundation 对象之间能够轻松的转换: CFStringRef aCFString = (CFStringRef)aNSString; NSSt ...