题目链接:http://hihocoder.com/problemset/problem/1617

题解:一道递推的dp题。这题显然可以考虑两个人同时从起点出发这样就不会重复了设dp[step][i][j]表示走了step步,第一个人在第i行第二个人在第j行第几列就用step减去就行

然后就是简单的递推注意第一个人一定是在第二个人上面的这样才确保不会重复。

#include <iostream>
#include <cstring>
#include <cstdio>
#define inf 0X3f3f3f3f
using namespace std;
int dp[2 * 233][233][233];
int a[233][233] , n;
bool Is(int step , int x , int y) {int x1 = step - x , y1 = step - y;return (x1 >= 0 && x1 < n && y1 >= 0 && y1 < n && x >= 0 && x < n && y >= 0 && y < n);
}
int get_val(int step , int x , int y) {if(Is(step , x , y)) return dp[step][x][y];return -inf;
}
int main() {scanf("%d" , &n);for(int i = 0 ; i < n ; i++) {for(int j = 0 ; j < n ; j++) {scanf("%d" , &a[i][j]);dp[0][i][j] = -inf;}}dp[0][0][0] = a[0][0];for(int step = 1 ; step <= 2 * n - 2 ; step++) {for(int i = 0 ; i < n ; i++) {for(int j = i ; j < n ; j++) {dp[step][i][j] = -inf;if(!Is(step , i , j)) continue;if(i != j) {dp[step][i][j] = max(dp[step][i][j] , get_val(step - 1 , i - 1 ,j - 1));dp[step][i][j] = max(dp[step][i][j] , get_val(step - 1 , i - 1 , j));dp[step][i][j] = max(dp[step][i][j] , get_val(step - 1 , i , j - 1));dp[step][i][j] = max(dp[step][i][j] , get_val(step - 1 , i , j));dp[step][i][j] += a[i][step - i] + a[j][step - j];}else {dp[step][i][j] = max(dp[step][i][j] , get_val(step - 1 , i - 1 , j - 1));dp[step][i][j] = max(dp[step][i][j] , get_val(step - 1 , i - 1 , j));dp[step][i][j] = max(dp[step][i][j] , get_val(step - 1 , i , j));dp[step][i][j] += a[i][step - i];//这里将他们到达同一点时val就取一次那么最大值肯定不是去走同一点的。
                }//这里的转移至要注意第一个人一定在第二个人上面就行,也就是说i>=j是必须的转移时也要注意
            }}}printf("%d\n" , dp[2 * n - 2][n - 1][n - 1] + a[0][0] + a[n - 1][n - 1]);return 0;
}

转载于:https://www.cnblogs.com/TnT2333333/p/7750054.html

hihocoder #1617 : 方格取数(dp)相关推荐

  1. hdu2167 方格取数 状态压缩dp

    题意:      方格取数,八个方向的限制. 思路:      八个方向的不能用最大流了,四个的可以,八个的不能抽象成二分图,所以目测只能用dp来跑,dp[i][j]表示的是第i行j状态的最优,具体看 ...

  2. hdu 1565 方格取数(1)(状态压缩dp)

    方格取数(1)                                                                 Time Limit: 10000/5000 MS (J ...

  3. Codevs 1043 方格取数

    1043 方格取数 2000年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果 题目描述 Descriptio ...

  4. dp4--codeVs1043 方格取数

    dp4--codeVs1043 方格取数 一.心得 二.题目 1043 方格取数 2000年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Dia ...

  5. XTU 二分图和网络流 练习题 C. 方格取数(1)

    C. 方格取数(1) Time Limit: 5000ms Memory Limit: 32768KB 64-bit integer IO format: %I64d      Java class ...

  6. 洛谷1004方格取数

    P1004 方格取数 题目描述 设有N*N的方格图(N<=9),我们将其中的某些方格中填入正整数,而其他的方格中则放 人数字0.如下图所示(见样例): A0 0 0 0 0 0 0 00 0 1 ...

  7. CSP2020-J2 题解 —— D题:方格取数

    题目相关 题目链接 目前还没有官方的题目,本题目来自洛谷,https://www.luogu.com.cn/problem/P7074?contestId=37027. 题目描述 设有 n×m 的方格 ...

  8. Java实现 蓝桥杯VIP 算法训练 方格取数

    问题描述 设有NN的方格图(N<=10),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字0. 某人从图的左上角的A 点(1,1)出发,可以向下行走,也可以向右走,直到到达右下角的B点 ...

  9. AcWing1027. 方格取数

    AcWing1027. 方格取数 设有 N×N 的方格图,我们在其中的某些方格中填入正整数,而其它的方格中则放入数字0.如下图所示: 某人从图中的左上角 A 出发,可以向下行走,也可以向右行走,直到到 ...

最新文章

  1. 检索所有课程都选修的的学生的学号与姓名
  2. 1021 Deepest Root (25 分) 【难度: 中 / 知识点: 树的直径 连通块】
  3. 开发环境和运行环境的区别_生产环境 VS 开发环境,关于Kubernetes的四大认识误区...
  4. 防火墙简介(二)——firewalld防火墙
  5. ppt flash倒计时器_PPT三大神器之iSlide插件
  6. python tensorflow教程_TensorFlow入门教程
  7. 安装sphinx的php扩展,安装php扩展sphinx
  8. console线驱动安装_低压灯带和高压灯带区别是啥 安装方法是啥?
  9. iOS DLNA
  10. spring mvc 简单的文件上传与下载
  11. informix sybase数据库下载地址
  12. 黑马程序员_Java基础(环境搭建、进制转换、运算符)
  13. 怎么在html页面添加qq临时会话
  14. 微信 iOS 收款到帐语音提醒开发总结
  15. UD三分区补充教程1——激活不同分区对于UD三分区bios启动和uefi启动兼容性影响的讨论
  16. java全栈工程师前景,已整理成文档
  17. 如何把两个PDF合成一个PDF文件
  18. supervisor 介绍,启动uwsgi失败,端口被占用
  19. android 数字滚动抽奖_Android滚动的数字更好看
  20. OpenCV中的神经网络

热门文章

  1. Discuz! 出现“您当前的访问请求当中含有非法字符“解决方法
  2. Linux下ps命令详解
  3. 如何使用纯CSS3来生成家谱(family tree)
  4. python爬虫循环表格xpath_python爬虫数据解析之xpath
  5. python 3d绘图立方体_python绘制3D立方体
  6. MATLAB学习笔记(十五)
  7. java 查找注解_Java利用反射如何查找使用指定注解的类详解
  8. mybatis 添加语句返回对象_Mybatis底层源码分析
  9. non thread safe php vc11,PHP 中什么线程安全(TS)和非线程安全(NTS)
  10. angular将html导出为pdf,如何使用Angular进行转换:将HTML转换为PDF