题目:假如有A,B两个人,在一个m*n的矩阵,然后A在(1,1),B在(m,1),A要走到(m,n),B要走到(1,n),两人走的过程中可以捡起格子上的数字,而且两人速度不一样,可以同时到一个点(哪怕这个点离A很近,离B很远),现在A,B起码相遇于一个点点,相遇点的数字A,B都得不到,求最后A,B总数字之和的最大值

B. Working out
Summer is coming! It's time for Iahub and Iahubina to work out, as they both want to look hot at the beach. The gym where they go is a matrix
a with n lines and
m columns. Let number
a[i][j] represents the calories burned by performing workout at the cell of gym in the
i-th line and the j-th column.
Iahub starts with workout located at line 1 and column
1. He needs to finish with workout
a[n][m]. After finishing workout
a[i][j], he can go to workout
a[i + 1][j] or a[i][j + 1]. Similarly, Iahubina starts with workout
a[n][1] and she needs to finish with workout
a[1][m]. After finishing workout from cell
a[i][j], she goes to either
a[i][j + 1] or
a[i - 1][j].
There is one additional condition for their training. They have to meet in exactly one cell of gym. At that cell, none of them will work out. They will talk about fast exponentiation (pretty odd small talk) and then both of them will move to the next workout.
If a workout was done by either Iahub or Iahubina, it counts as total gain. Please plan a workout for Iahub and Iahubina such as total gain to be as big as possible. Note, that Iahub and Iahubina can perform workouts with different speed, so the number of
 cells that they use to reach meet cell may differs.
Input
The first line of the input contains two integers n and
m (3 ≤ n, m ≤ 1000). Each of the next
n lines contains m integers:
j-th number from i-th line denotes element
a[i][j] (0 ≤ a[i][j] ≤ 105).
Output
The output contains a single number — the maximum total gain possible.
Sample test(s)
Input
3 3
100 100 100
100 1 100
100 100 100
 
Output
800
/*
思路:
要找最大值,那么只能有一个相遇点
如果用两个数组再来枚举相遇点是不可能的
所以比如说左上到右下,可以换成左上到相遇点,右下到相遇点
另一条路线也是如此 枚举各种可能的相交点,那么从左下角走到相交点或者从左上角走到
相交点的各种情况很容易用for写出来
可是从相交点到终点不好写,因为相交点是枚举的,
相当于未知,
逆向思维:从相交点到终点==从终点到相交点
而终点只有两个,递推就是要从已知到未知
那么这题就转换成从四个边角点到未知点
*/
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll maxn=+;
ll f[maxn][maxn]={},dp1[maxn][maxn],dp2[maxn][maxn],dp3[maxn][maxn],dp4[maxn][maxn];
int main()//定义数组f存基础数字,dp1代表从左上角递推
//dp2左下角,dp3右下角,dp4右上角
{
//输入环节
ll m,n;
cin>>m>>n;
for(ll i=;i<=m;i++)
for(ll j=;j<=n;j++)
{
scanf("%lld",&f[i][j]);
} //处理环节
dp1[][]=f[][];//对dp1边缘赋值,即左边和上边两面墙赋入初始值
for(ll i=;i<=m;i++)
dp1[i][]+=f[i][]+dp1[i-][];
for(ll j=;j<=n;j++)
dp1[][j]+=f[][j]+dp1[][j-]; dp2[m][]=f[m][];//对dp2边缘赋值
for(ll i=m-;i>=;i--)
dp2[i][]+=f[i][]+dp2[i+][];
for(ll j=;j<=n;j++)
dp2[m][j]+=f[m][j]+dp2[m][j-]; dp4[][n]=f[][n];//对dp4边缘赋值
for(ll i=;i<=m;i++)
dp4[i][n]+=f[i][n]+dp4[i-][n];
for(ll j=n-;j>=;j--)
dp4[][j]+=f[][j]+dp4[][j+]; dp3[m][n]=f[m][n];//对dp3边缘赋值
for(ll i=m-;i>=;i--)
dp3[i][n]+=f[i][n]+dp3[i+][n];
for(ll j=n-;j>=;j--)
dp3[m][j]+=f[m][j]+dp3[m][j+]; for(ll i=;i<=m;i++)//让i从2到m,j从2到n
for(ll j=;j<=n;j++)//下面再通过调一下下标与i,j的关系实现同时处理四个数组
{
dp1[i][j]+=f[i][j]+max(dp1[i-][j],dp1[i][j-]);
dp4[i][n-j+]+=f[i][n-j+]+max(dp4[i][n-j++],dp4[i-][n-j+]);
dp2[m-i+][j]+=f[m-i+][j]+max(dp2[m-i++][j],dp2[m-i+][j+]);
dp3[m-i+][n-j+]+=f[m-i+][n-j+]+max(dp3[m-i++][n-j+],dp3[m-i++][n-i++]);
}//dp1从左下角开始递推,dp2,3,4也从其他三个角开始递推
ll ans=;
for(ll i=;i<=m;i++)//这里两个for循环枚举相遇点
for(ll j=;j<=n;j++)
{
ans=max(ans,dp1[i][j]+dp2[i][j]+dp3[i][j]+dp4[i][j]-*f[i][j]);
}//如果[i][j]是相遇点,那么f[i][j]在dp1,dp2,dp3,dp4都被多拿了
//(相遇点的数字不能拿,所以要减去4*f[i][j])
cout<<ans<<endl;
return ;
/*********************这里预备一串代码输出dp1到dp4后来的具体情况
可以自己用来检验dp1到dp4是否和自己想想的结果一样
printf("\n");
for(ll i=1;i<=m;i++)
for(ll j=1;j<=n;j++)
{
printf("%lld ",dp1[i][j]);
if(j==3)printf("\n");
}
printf("\n");
for(ll i=1;i<=m;i++)
for(ll j=1;j<=n;j++)
{
printf("%lld ",dp2[i][j]);
if(j==3)printf("\n");
}
printf("\n");
for(ll i=1;i<=m;i++)
for(ll j=1;j<=n;j++)
{
printf("%lld ",dp3[i][j]);
if(j==3)printf("\n");
}printf("\n");
for(ll i=1;i<=m;i++)
for(ll j=1;j<=n;j++)
{
printf("%lld ",dp4[i][j]);
if(j==3)printf("\n");
}printf("\n");
************************/ }

四角递推(CF Working out,动态规划递推)的更多相关文章

  1. 最长上升子序列(动态规划递推,LIS)

    1759:最长上升子序列 题目: 总时间限制: 2000ms 内存限制: 65536kB 描述 一个数的序列bi,当b1 < b2 < ... < bS的时候,我们称这个序列是上升的 ...

  2. 最大子段和(洛谷P1115,动态规划递推)

    洛谷题目链接 题目赋值出来格式有问题,所以我就只放题目链接了 下面为ac代码 #include<bits/stdc++.h> #define ll long long using name ...

  3. 【Luogu4723】线性递推(常系数齐次线性递推)

    [Luogu4723]线性递推(常系数齐次线性递推) 题面 洛谷 题解 板子题QwQ,注意多项式除法那里每个多项式的系数,调了一天. #include<iostream> #include ...

  4. 推送通知/传感器/UIDynamic仿真(推送通知已适配iOS10)

    推送通知/传感器/UIDynamic 一.推送通知 1.推送通知简介 什么是推送通知 此处的推送通知与NSNotification没有任何关系 可以理解为,向用户推送一条信息来通知用户某件事情 作用: ...

  5. iOS的推送机制APNs:本地推送&远程推送

    本地推送: 本地推送主要应用在备忘录,闹钟等本地的,基于时间定时的消息提醒.本篇不做详细描述. 远程推送:APNS(苹果推送通知服务) iOS远程推送机制的原理及流程: 注册推送(橙色部分):若该Ap ...

  6. 与众不同 windows phone (9) - Push Notification(推送通知)之概述, 推送 Toast 通知

    原文:与众不同 windows phone (9) - Push Notification(推送通知)之概述, 推送 Toast 通知 [索引页][源码下载] 与众不同 windows phone ( ...

  7. Windows Phone开发(43):推送通知第一集——Toast推送

    原文:Windows Phone开发(43):推送通知第一集--Toast推送 好像有好几天没更新了,抱歉抱歉,最近"光荣"地失业,先是忙于寻找新去处,唉,暂时没有下文.而后又有一 ...

  8. 推送之HelloWorld及个推Smart Push

    最近有个朋友想要推送一些消息到自己的APP上,自己用了HTTP轮询的方式比较耗电,也比较占用流量,一旦用户关闭了进程,消息则很难触达,于是,咨询我有没有什么好的解决方案.我告诉他其实可以使用推送,他瞪 ...

  9. java推送数据到app--极光推送

    之前项目有用到需要把数据推送到app端 采用的是极光推送 特此把工具类和pom.xml需要的jar整理如下 pom.xml需要jar如下 <!-- 极光推送 --> <depende ...

随机推荐

  1. "Hello world" of ML

    #!/usr/bin/python import os import pandas as pd from sklearn.datasets import fetch_openml import mat ...

  2. 27. FormPanel类的defaults属性

    defaults : Object defaults属性可以包含任意个name/value属性对,这些属性将会被添加到每一个元素中...例如, 为了自动向容器包含的每个Ext.Panel 元素的宽度添 ...

  3. 使用AngularJS创建应用的5个框架(转)

    原文地址:http://www.php100.com/html/dujia/2015/0206/8580.html 本文由PHP100中文网编译,转载请看文末的转载要求,谢谢合作! 如果你计划使用An ...

  4. UVaLive 6832 Bit String Reordering (模拟)

    题意:给定一个01序列,然后让你你最少的操作数把这它变成目标. 析:由于01必须是交替出现的,那么我们就算两次,然后取最值. 代码如下: #pragma comment(linker, "/ ...

  5. Unity使用外部版本控制

    Using External Version Control Systems with Unity Unity offers an Asset Server add-on product for ea ...

  6. Python基础:一起来面向对象 (一)

    类,一群有着相同属性和函数的对象的集合 如果你不满足于只做一个+CRUD“码农”,而是想成为一个优秀的工程师,那就一定要积极锻炼直觉思考和快速类比的能力,其是在找不到bug的时候 类的示例: clas ...

  7. Lightoj 1020 - A Childhood Game (博弈)

    题目链接: 1020 - A Childhood Game 题目描述: Alice和Bob在玩弹珠游戏,两人轮流拿走弹珠,每次只能拿走一个或者两个,当Alice作为先手时谁拿走最后一个就是输家,而Bo ...

  8. 题解报告:poj 1321 棋盘问题(dfs)

    Description 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子 ...

  9. 内联标签------------大多数XHTML可以表示为两种类型的标签:块标签(block tag)和内联标签(inline tag)

    内联标签 <em> 强调,大部分浏览器渲染为斜体. <strong> 强调,大部分浏览器渲染为黑体. <sub> 下标 <sup> 上标 内联标签通常用 ...

  10. Linux命令(008) -- yum

    yum命令(全称为Yellow dog Updater, Modified)是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器.基于RPM包管理,能够从指定的服务器自动下 ...