题目链接:http://acm.swust.edu.cn/problem/1084/

Time limit(ms): 1000        Memory limit(kb): 65535
 
Description

小时候,Mzx0821暗恋班上的一个妹子Zzx。

一次班上做活动,班上同学被安排坐成m行n列的矩阵,Mzx0821坐在坐标(x1,y1)的位置,Zzx坐在坐标(x2,y2)的位置。活动过程中,Mzx0821写了一张纸条想给Zzx,但是Mzx0821又不想班上其他人看到他写的内容,于是Mzx0821给班上每个人定义了一个保密程度值(就是这个人不偷看纸条内容的可能),每个人传递纸条只能给前后左右的人。

Mzx0821还考虑到万一Zzx给Mzx0821回纸条怎么办呢,为了保密,Mzx0821希望每个人最多传递一次纸条,就是说一个人在Mzx0821传给Zzx的时候帮了忙,就不能再帮Zzx传给Mzx0821,反之亦然。

Mzx0821希望找到这样两条路,使得来回两条路上的保密程度值的和最大,为了尽快传到,这两条路必须是Mzx0821到Zzx的之间的最短路。

Mzx0821智商实在捉急,于是向机智的学弟学妹们求助,你能帮助他找到正确的路线吗?

Input

输入第一行有2个用空格隔开的整数m和n,表示班里有m行n列(1<=m,n<=50)。

为了简化问题我们假设Mzx0821坐在左上角,Zzx坐在右下角。

接下来的m行是一个m*n的矩阵,矩阵中第i行j列的整数表示坐在第i行j列的学生的保密程度。每行的n个整数之间用空格隔开。

友情提示:Mzx0821坐标点的值和Zzx坐标点的值为0,坐标点的值<10000。

 
Output

输出共一行,包含一个整数,表示来回两条路上参与传递纸条的学生的保密程度之和的最大值。

 
Sample Input
3 3
0 3 9
2 8 5
5 7 0
Sample Output
34
 
输出换行请使用\r\n
 
 
解题思路:一个简单的双线程dp,直接写就是了,两个人同一个方向同时走,dp[i][j][x][y],代表第一个人走到(i,j),第二个人走到(x,y)的最大值
 

我们转化一下思想,题目中说由左上方到右下方来回,我们可以看作是从左上方找两条不相交的路径到右下方。这里我们可以好比是两个纸条同时从左上方向右下方传,只要保证在同一时刻两个纸条不在同一个人手里,那么我们就能保证两个字条的路径不相交.

  确定算法: DP(动态规划)
  状态:当前时刻的两个字条的坐标。

  状态转移方程式 :

  dp[i][j][x][y]= max{ dp[i-1][j][x-1][y],dp[i-1][j][x][y-1],dp[i][j-1][x-1][y],dp[i][j-1][x][y-1] }+mpt[i][j]+mpt[x][y]

  为了保证两个字条是同步传递的,所以方程式要加一个限定条件 ( i + j = x + y )☆
 
代码如下:
 #include<iostream>
#include<cstring>
#include<algorithm>
using namespace std; #define maxn 51
int m, n, mpt[maxn][maxn];
int dp[maxn][maxn][maxn][maxn];
//同一个方向同时走
//dp[i][j][x][y]代表当第一个人走到i,j且第二个人走到x,y时的最大值 int max(int x, int y, int z, int w){
return max(max(max(x, y), z), w);
}
int main()
{
while (cin >> m >> n){
memset(dp, , sizeof(dp));
for (int i = ; i <= m; i++)
for (int j = ; j <= n; j++)
cin >> mpt[i][j];
for (int i = ; i <= m; i++){
for (int j = ; j <= n; j++){
//第二个人走的路径在第一个人的下面,
for (int x = i + ; x <= m; x++){
int y = i + j - x;
if (y <= )continue;
dp[i][j][x][y] = max(dp[i - ][j][x - ][y], dp[i - ][j][x][y - ], dp[i][j - ][x][y - ], dp[i][j - ][x - ][y]) + mpt[i][j] + mpt[x][y];
}
}
}
//最后第一个人到终点的左边,第二个人到终点的右边
cout << dp[m - ][n][m][n - ] << "\r\n";
}
return ;
}

代码还可以优化成三维数组:

 #include<iostream>
#include<cstring>
#include<algorithm>
using namespace std; #define maxn 51
int m, n, mpt[maxn][maxn];
int dp[maxn][maxn][maxn];
//同一个方向同时走 int max(int x, int y, int z, int w){
return max(max(max(x, y), z), w);
}
int main()
{
while (cin >> m >> n){
memset(dp, , sizeof(dp));
for (int i = ; i <= m; i++)
for (int j = ; j <= n; j++)
cin >> mpt[i][j];
for (int i = ; i <= m; i++){
for (int j = ; j <= n; j++){
for (int x = ; x < i; x++){
dp[i][j][x] = max(dp[i - ][j][x - ], dp[i - ][j][x], dp[i][j - ][x - ], dp[i][j - ][x]) + mpt[i][j] + mpt[x][i + j - x];
}
}
}
//最后第一个人到终点的左边,第二个人到终点的右边
cout << dp[m][n - ][m - ] << "\r\n";
}
return ;
}

[Swust OJ 1084]--Mzx0821月赛系列之情书(双线程dp)的更多相关文章

  1. 51Nod 1084 矩阵取数问题 V2 双线程DP 滚动数组优化

    基准时间限制:2 秒 空间限制:131072 KB  一个M*N矩阵中有不同的正整数,经过这个格子,就能获得相应价值的奖励,先从左上走到右下,再从右下走到左上.第1遍时只能向下和向右走,第2遍时只能向 ...

  2. [Swust OJ 404]--最小代价树(动态规划)

    题目链接:http://acm.swust.edu.cn/problem/code/745255/ Time limit(ms): 1000 Memory limit(kb): 65535   Des ...

  3. [Swust OJ 649]--NBA Finals(dp,后台略(hen)坑)

    题目链接:http://acm.swust.edu.cn/problem/649/ Time limit(ms): 1000 Memory limit(kb): 65535 Consider two ...

  4. SWUST OJ NBA Finals(0649)

    NBA Finals(0649) Time limit(ms): 1000 Memory limit(kb): 65535 Submission: 404 Accepted: 128   Descri ...

  5. C#多线程编程系列(二)- 线程基础

    目录 C#多线程编程系列(二)- 线程基础 1.1 简介 1.2 创建线程 1.3 暂停线程 1.4 线程等待 1.5 终止线程 1.6 检测线程状态 1.7 线程优先级 1.8 前台线程和后台线程 ...

  6. Java Thread系列(四)线程通信

    Java Thread系列(四)线程通信 一.传统通信 public static void main(String[] args) { //volatile实现两个线程间数据可见性 private ...

  7. Java Thread系列(三)线程安全

    Java Thread系列(三)线程安全 一.什么是线程安全 线程安全概念:当多个线程访问某一个类(对象或方法)时,这个类始终都能表现出正确的行为,那么这个类(对象或方法)就是线程安全的. 线程安全来 ...

  8. Java Thread系列(二)线程状态

    Java Thread系列(二)线程状态 一.线程的五种状态 新建状态(New):新创建了一个线程对象,尚未启动. 就绪状态(Runnable):也叫可运行状态.线程对象创建后,其他线程调用了该对象的 ...

  9. Java Thread系列(一)线程创建

    Java Thread系列(一)线程创建 Java 中创建线程主要有三种方式:继承 Thread.实现 Runnable 接口.使用 ExecutorService.Callable.Future 实 ...

随机推荐

  1. eclipse maven SLF4J: Failed to load class org.slf4j.impl.StaticLoggerBinder

    现象:运行eclipse maven build,console 有红色日志如下: SLF4J: Failed to load class "org.slf4j.impl.StaticLog ...

  2. R语言学习之主成分分析法的R实践

    主成分分析R软件实现程序(一): >d=read.table("clipboard",header=T) #从剪贴板读取数据 >sd=scale(d)  #对数据进行标 ...

  3. VS前台设计中的缺陷

    程序的前台界面设计我一般都是Blend中完成的,因为在VS中前台比较难控制.而效果之内的就更不用说了.今天写了个小程序用来启动其他程序的.运行界面如下: 这是尺寸和距离刚刚好的,我们去Blend当中看 ...

  4. HDU 1131 Count the Trees

    卡特兰数再乘上n的阶乘 #include<iostream> #include<cstdio> using namespace std; #define base 10000 ...

  5. c#Winform程序的toolStripButton自己定义背景应用演示样例源代码

    C# Winform程序的toolStrip中toolStripButton的背景是蓝色的,怎样改变背景及边框的颜色和样式呢? 实现此功能须要重写toolStripButton的Paint方法 这里仅 ...

  6. 百度复制SQL语句

    本词条从基础知识.判断对象和应用技巧等方面,介绍了SQL(Structured Query Language)结构化查询语言的应用方法. 目录 1基础 ▪ 创建数据库▪ 删除数据库▪ 备份sql se ...

  7. 工具篇-MAT(Memory Analyzer Tool)

    --- layout: post title: 工具篇-MAT(Memory Analyzer Tool) description: 让内存泄漏无所遁形 2015-10-08 category: bl ...

  8. spring和mybatis整合进行事务管理

    1.声明式实现事务管理 XML命名空间定义,定义用于事务支持的tx命名空间和AOP支持的aop命名空间: <beans xmlns="http://www.springframewor ...

  9. 裸机代码(uboot) : clear bss

    一. bss介绍: 代码中函数.变量.常量 / bss段.data段.text段 /sct文件..map文件的关系[实例分析arm代码(mdk)] bss和data的区别: 全局的未初始化变量存在于. ...

  10. JavaSE学习总结第10天_面向对象5

      10.01 运动员和教练案例分析 教练和运动员案例:运动员分乒乓球运动员和篮球运动员,教练分乒乓球教练和篮球教练.为了出国交流,跟乒乓球相关的人员都需要学习英语. 分析: 10.02 运动员和教练 ...