方格游戏:http://codevs.cn/problem/2853/

这和传纸条和noip方格取数这两个题有一定的相似性,当第一眼看到的时候我们就会想到设计$dp[i][j][k][l]$(i,j表示一个人走到 i 行 j 个点,而另一个人走到 k 行第l个点)这么一个状态。

转移方程当然是$dp[i][j][k][l] = max \{ dp[i-1][j][k-1][l] ,dp[i-1][j][k][l-1] ,dp[i][j-1][k-1][l] ,dp[i][j-1][k][l-1 \} $。

这样设计没问题,只是空间限制不足,现在我们考虑进行优化。

注意题目中的一个限制条件,只能向右和向下走,那么每个人每次走到的点到出发点的曼哈顿距离相等。

曼哈顿距离:可以理解为 | 当前点的横坐标-出发点的横坐标 | + |当前点的纵坐标-出发点的纵坐标 | 。

有了曼哈顿距离,那么我们可以由每个点的横坐标表示出每个点的纵坐标,如此的话,我们设计状态的时候可以只设计每个人的横坐标加上曼哈顿距离这一状态。

那么这就是一个三维dp[i][j][k](i表示第一个人的横坐标,j表示的二个人的,k表示曼哈顿距离)。

说到如何继承无非有四种:

$dp[i][j][k] = max \{ dp[i-1][j][k-1] ,dp[i][j-1][k-1] ,dp[i-1][j-1][k-1] ,dp[i][j][k-1] \}$

不要忘记加上走到这个点获得的公平值。

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int n,a[][];
int dp[][][];
int max(int a,int b){ return a>b?a:b; }
int abs(int x){ return x<?-x:x; }
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
scanf("%d",&a[i][j]);
for(int k=;k<*n;k++)
{
for(int i=;i<=k&&i<=n;i++)
{
for(int j=;j<=k&&j<=n;j++)
{
int s=max(max(dp[i-][j][k-],dp[i][j-][k-]),max(dp[i-][j-][k-],dp[i][j][k-]));
dp[i][j][k]=s+abs(a[i][k-i+]-a[j][k-j+]);
}
}
}
printf("%d",dp[n][n][*n-]);
}

最新文章

  1. [LeetCode] Design Hit Counter 设计点击计数器
  2. css3制作六边形图片
  3. Swift compile slow 编译慢问题
  4. poj 3692 二分图最大匹配
  5. HDOJ/HDU 2547 无剑无我(两点间的距离)
  6. [Leetcode][001] Two Sum (Java)
  7. python高级编程之最佳实践,描述符与属性01
  8. CodeForces 213B Numbers
  9. 基于socket.io打造hybrid调试页面
  10. [OpenCV学习笔记1][OpenCV基本数据类型]
  11. day09_request&amp;response学习笔记
  12. jsp内置对象-config对象
  13. maven历史版本下载地址
  14. linux 系统管理学习
  15. Mysql 双主架构配置从复制
  16. linux常用服务程序一键安装
  17. 【python】python常用函数
  18. MySql数据库批量备份命令
  19. angular项目中使用jQWidgets
  20. 基于微信小程序的用户列表点赞功能

热门文章

  1. bzoj 3573: [Hnoi2014]米特运输【树形dp+瞎搞】
  2. Luogu P3694 邦邦的大合唱站队 【状压dp】By cellur925
  3. Java 反射机制详解(下)
  4. iOS 加载Viewcontroller的几种方法
  5. MVC 感触
  6. 跟我一起玩Win32开发(21):复制&amp;粘贴&amp;剪贴板操作
  7. 在img标签上尽量不要使用onerror事件
  8. udp聊天交互
  9. 洛谷p2234/BZOJ1588 [HNOI2002]营业额统计
  10. (转)生产者/消费者问题的多种Java实现方式