题目描述:

题意:

有n*m个格子, 走过一个格子可以得到相应的分数. 
A 从(1,1)沿 下 或 右 走到(n,m) 
B 从(n,1)沿 上 或 右 走到(1,m) 
两人路径有且只能有一个格子重合(重合格子的分数不算), 求两人分数之和的最大值.

首先要保证只有一个格子重合,那么只可能是以下两种情况: 
1) A向右走,相遇后继续向右走,而B向上走,相遇后继续向上走 
2) A向下走,相遇后继续向下走,而B向右走,相遇后继续向右走

接着枚举相遇的格子(i,j)即可,考虑四个方向的dp

dp1[i][j] := 从 (1, 1) 到 (i, j) 的最大分数 
dp2[i][j] := 从 (i, j) 到 (n, m) 的最大分数 
dp3[i][j] := 从 (n, 1) 到 (i, j) 的最大分数 
dp4[i][j] := 从 (i, j) 到 (1, m) 的最大分数

代码:

 #include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=1e3+;
int a[maxn][maxn];
int dp1[maxn][maxn];//(1,1)-(i,j)
int dp2[maxn][maxn];//(i,j)-(1,1)
int dp3[maxn][maxn];//(n,1)-(i,j)
int dp4[maxn][maxn];//(i,j)-(n,1)
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++) scanf("%d",&a[i][j]);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++) dp1[i][j]=a[i][j]+max(dp1[i][j-],dp1[i-][j]);
for(int i=n;i>=;i--)
for(int j=m;j>=;j--)
dp2[i][j]=a[i][j]+max(dp2[i][j+],dp2[i+][j]);
for(int i=n;i>=;i--)
for(int j=;j<=m;j++)
dp3[i][j]=a[i][j]+max(dp3[i+][j],dp3[i][j-]);
for(int i=;i<=n;i++)
for(int j=m;j>=;j--)
dp4[i][j]=a[i][j]+max(dp4[i][j+],dp4[i-][j]);
int ans=;
for(int i=;i<n;i++)
for(int j=;j<m;j++)
{
ans=max(ans,dp1[i][j-]+dp2[i][j+]+dp3[i+][j]+dp4[i-][j]);
ans=max(ans,dp3[i][j-]+dp4[i][j+]+dp2[i+][j]+dp1[i-][j]);
}
printf("%d\n",ans);
return ;
}

样例中的dp1,dp2,dp3,dp4最终结果为:

100  300
201 400
300 400 500 500 400 300
400 201
300 100 300 400 500
201 400
100 300 300 100
400 201
500 400 300

在最终求出结果时:

for(int i=2;i<n;i++)
{

  for(int j=2;j<m;j++)
  {
    ans=max(ans,dp1[i][j-1]+dp2[i][j+1]+dp3[i+1][j]+dp4[i-1][j]);
    ans=max(ans,dp3[i][j-1]+dp4[i][j+1]+dp2[i+1][j]+dp1[i-1][j]);
  }

}

第一种情况下的ans的值为黄色部分值相加,第二种情况下的ans的值为蓝色部分值相加;

Working out(DP)的更多相关文章

  1. LightOJ 1033 Generating Palindromes(dp)

    LightOJ 1033  Generating Palindromes(dp) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid= ...

  2. lightOJ 1047 Neighbor House (DP)

    lightOJ 1047   Neighbor House (DP) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=87730# ...

  3. UVA11125 - Arrange Some Marbles(dp)

    UVA11125 - Arrange Some Marbles(dp) option=com_onlinejudge&Itemid=8&category=24&page=sho ...

  4. 【POJ 3071】 Football(DP)

    [POJ 3071] Football(DP) Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4350   Accepted ...

  5. 初探动态规划(DP)

    学习qzz的命名,来写一篇关于动态规划(dp)的入门博客. 动态规划应该算是一个入门oier的坑,动态规划的抽象即神奇之处,让很多萌新 萌比. 写这篇博客的目标,就是想要用一些容易理解的方式,讲解入门 ...

  6. Tour(dp)

    Tour(dp) 给定平面上n(n<=1000)个点的坐标(按照x递增的顺序),各点x坐标不同,且均为正整数.请设计一条路线,从最左边的点出发,走到最右边的点后再返回,要求除了最左点和最右点之外 ...

  7. 2017百度之星资格赛 1003:度度熊与邪恶大魔王(DP)

    .navbar-nav > li.active > a { background-image: none; background-color: #058; } .navbar-invers ...

  8. Leetcode之动态规划(DP)专题-详解983. 最低票价(Minimum Cost For Tickets)

    Leetcode之动态规划(DP)专题-983. 最低票价(Minimum Cost For Tickets) 在一个火车旅行很受欢迎的国度,你提前一年计划了一些火车旅行.在接下来的一年里,你要旅行的 ...

  9. 最长公共子序列长度(dp)

    /// 求两个字符串的最大公共子序列长度,最长公共子序列则并不要求连续,但要求前后顺序(dp) #include <bits/stdc++.h> using namespace std; ...

  10. Leetcode之动态规划(DP)专题-647. 回文子串(Palindromic Substrings)

    Leetcode之动态规划(DP)专题-647. 回文子串(Palindromic Substrings) 给定一个字符串,你的任务是计算这个字符串中有多少个回文子串. 具有不同开始位置或结束位置的子 ...

随机推荐

  1. C# 我的小画板

    我的画板 先看实现图 实现过程 using System; using System.Collections.Generic; using System.ComponentModel; using S ...

  2. PID控制器开发笔记之九:基于前馈补偿的PID控制器的实现

    对于一般的时滞系统来说,设定值的变动会产生较大的滞后才能反映在被控变量上,从而产生合理的调节.而前馈控制系统是根据扰动或给定值的变化按补偿原理来工作的控制系统,其特点是当扰动产生后,被控变量还未变化以 ...

  3. UserNotifications ios10 通知使用

    通知在ios10 中推荐使用 导入  import UserNotifications  头文件 if #available(iOS 10.0, *) { UNUserNotificationCent ...

  4. 大明A+B

    大明A+B 时间限制: 1 Sec  内存限制: 32 MB 以内加法的那个"小明"了,现在他甚至会任意长度的正小数的加法.现在,给你两个正的小数A和B,你的任务是代表大明计算出A ...

  5. linux把程序做成系统服务并自启动

    chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息.谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接. 一.chkconfig 的使用语法1.c ...

  6. Two Sum【LeetCode】

    Given an array of integers, return indices of the two numbers such that they add up to a specific ta ...

  7. GAN-生成对抗网络原理

    最近一直在看GAN,我一直认为只有把博客看了一遍,然后再敲一遍.这样才会有深刻的感悟. GAN(生成式对抗网络)(GAN, Generative Adversarial Networks )是一种深度 ...

  8. python 装饰器--对有无参数的函数进行装饰

    # 使用装饰器无参数的函数进行装饰# def func(funcionName): # print('-----1------') # def func_in(): # print('--func_i ...

  9. Nginx配置TCP请求转发

    Nginx配置TCP请求转发 1.TCP请求转发基于stream在1.9版本前,需要单独编译安装该组建: # 依赖服务 [root@baolin conf]#yum -y install pcre-d ...

  10. 封装cuda/cudnn写卷积网络前向计算程序

    目录 基本编译配置 一些常识 BN层的坑 cuda基础 向cuda核函数传入结构体指针? 参考:http://galoisplusplus.coding.me/blog/2018/05/22/cuda ...