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) ...
随机推荐
- struts2学习之基础笔记5
第十章 Struts 2的输入校验 1 Struts 2 输入校验原理 a . 分类 validate()方法校验 b . validation框架校验 2 valibate()方法校验实现 步骤 ...
- mysql学习 1
1.数据库(Database)是按照数据结构来组织.存储和管理数据的仓库 2.RDBMS即关系数据库管理系统(Relational Database Management System)的特点: 1) ...
- 对ListView的Item子控件监听并跳转页面
public class MyAdapteforOwner extends BaseAdapter{ List<OwnerDevice>datas; private Context con ...
- 使用css选择器来定位元素
public void CSS(){ driver.get(Constant.baidu_url); //绝对路径 // driver.findElement(By.cssSelector(" ...
- 最新消息,CDRX7冰点价再返现,你知道么?
一年一度的七夕又到来了,这不很多的单身狗朋友们都已经自备好了狗粮,准备在家里宅上一天呢? 开个玩笑今天小编就为各位带来了 一个劲爆大消息... Deng/deng/deng/deng..就是备受万众瞩 ...
- ZBrush通过遮罩得到子物体
ZBrush 中通过遮罩为模型添加子物体的方法简单且方便,我们可以通过按住Ctrl键绘制遮罩结合相关命令创建具有抽出厚度的模型提取出作为子物体附在模型表面.本文将详细介绍在Zbrush中如何通过遮罩得 ...
- 在centos6.5上升级php-libxml版本到2.9.0
当前系统,软件版本说明: php libxml glibc 2.12 zlib xz-libs 需求: 应开发的需求,线上环境,php-libxml版本升级到2.8以上. 升级步骤:1.安装工具集 y ...
- 凸多边形 HRBUST - 1429 计算几何_凸包_未调完
任选一个点作为起始点,将其他点按与该点连线的极角排序,二分查询点在哪两个射线之间, 并特别判断一下边界即可. Code: #include <cstdio> #include <al ...
- [NOIP补坑计划]NOIP2015 题解&做题心得
感觉从15年开始noip就变难了?(虽然自己都做出来了……) 场上预计得分:100+100+60~100+100+100+100=560~600(省一分数线365) 题解: D1T1 神奇的幻方 题面 ...
- java中的string trim具体有什么用处。。。
去掉字符串首尾空格 防止不必要的空格导致错误public class test{ public static void main(String[] args) { String str = " ...