南阳OJ 61 传纸条(一)
传纸条(一)
- 描述
-
小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题。一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了。幸运的是,他们可以通过传纸条来进行交流。纸条要经由许多同学传到对方手里,小渊坐在矩阵的左上角,坐标(1,1),小轩坐在矩阵的右下角,坐标(m,n)。从小渊传到小轩的纸条只可以向下或者向右传递,从小轩传给小渊的纸条只可以向上或者向左传递。
在活动进行中,小渊希望给小轩传递一张纸条,同时希望小轩给他回复。班里每个同学都可以帮他们传递,但只会帮他们一次,也就是说如果此人在小渊递给小轩纸条的时候帮忙,那么在小轩递给小渊的时候就不会再帮忙。反之亦然。
还有一件事情需要注意,全班每个同学愿意帮忙的好感度有高有低(注意:小渊和小轩的好心程度没有定义,输入时用0表示),可以用一个0-1000的自然数来表示,数越大表示越好心。小渊和小轩希望尽可能找好心程度高的同学来帮忙传纸条,即找到来回两条传递路径,使得这两条路径上同学的好心程度之和最大。现在,请你帮助小渊和小轩找到这样的两条路径。
- 输入
- 第一行输入N(0<N<100)表示待测数据组数。
每组测试数据输入的第一行有2个用空格隔开的整数m和n,表示班里有m行n列(2<=m,n<=50)。
接下来的m行是一个m*n的矩阵,矩阵中第i行j列的整数表示坐在第i行j列的学生的好心程度(不大于1000)。每行的n个整数之间用空格隔开。 - 输出
- 每组测试数据输出共一行,包含一个整数,表示来回两条路上参与传递纸条的学生的好心程度之和的最大值。
- 样例输入
-
1
3 3
0 3 9
2 8 5
5 7 0 - 样例输出
-
34




示例代码1 [四维数组]:
注意:运用四维数组提交后报错【TimeLimitExceeded】
#include <iostream>
#include<stdio.h>
#include<cmath>
using namespace std; #define MAX_NUM 52 int map[MAX_NUM][MAX_NUM]; //好心程度 | 权值
int dp[MAX_NUM][MAX_NUM][MAX_NUM][MAX_NUM]; int maxPath(int m, int n)
{
for (int x1 = ; x1 <= m; x1++)
{
for (int y1 = ; y1 <= n; y1++)
{
for (int x2 = ; x2 <= m; x2++)
{
for (int y2 = ; y2 <= n; y2++)
{
/*
如果第一个人没有走到最后一行或最后一列,并且两个人没有重复
因为走到最后一行或最后一列,容易造成第二个人无路可走的情况
*/
if ((x1 < m || y1 < n) && x1 == x2 && y1 == y2)
{
continue;
}
dp[x1][y1][x2][y2] = max( max(dp[x1-][y1][x2-][y2], dp[x1-][y1][x2][y2-]),
max(dp[x1][y1-][x2-][y2], dp[x1][y1-][x2][y2-]))
+ map[x1][y1] + map[x2][y2];
}
}
}
}
return dp[m][n][m][n];
} int main()
{
int x;
scanf("%d", &x);
while (x--) {
int m, n;
scanf("%d%d", &m, &n); for (int i = ;i <= m; i++)
for (int j = ;j <= n; j++)
scanf("%d", &map[i][j]); int ans = maxPath(m, n);
printf("%d\n", ans);
} return ;
}
示例代码2 [三维数组]:
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std; #define MAX_NUM 52 int map[MAX_NUM][MAX_NUM]; //好心程度 | 权值
int dp[MAX_NUM+MAX_NUM][MAX_NUM][MAX_NUM]; int maxPath(int m, int n)
{
for (int k = ;k <= m+n-; k++)
{
for (int x1 = ; x1 <= k; x1++)
{
for (int x2 = ; x2 <= k; x2++)
{
if (x1 == x2) //x1 == x2 相当于(x1 == x2 && y1 = y2)
{
continue;
}
dp[k][x1][x2] = max(max(dp[k-][x1][x2], dp[k-][x1-][x2-]),
max(dp[k-][x1-][x2], dp[k-][x1][x2-]))
+ map[x1][k-x1] + map[x2][k-x2];
}
}
}
return dp[m+n-][m-][m-];
} int main()
{
int x;
scanf("%d", &x);
while (x--) {
int m, n;
scanf("%d%d", &m, &n); for (int i = ; i < m; i++)
for (int j = ; j < n; j++)
scanf("%d", &map[i][j]); int ans = maxPath(m, n);
printf("%d\n", ans);
} return ;
}
示例代码3 [二维数组]:
#include<iostream>
#include<cstdio>
#include<string.h>
#include<cmath>
using namespace std; #define MAX_NUM 52 int map[MAX_NUM][MAX_NUM]; //好心程度 | 权值
int dp[MAX_NUM][MAX_NUM]; int maxPath(int m, int n)
{
memset(dp, , sizeof(dp));
for (int k = ; k <= m+n-; k++)
{
for (int x1 = m-; x1 >= ; x1--)
{
for (int x2 = m-; x2 > x1; x2--)
{
if ( k >= x1 && k >= x2) //x + y = k,当k >= x时,说明还在矩阵范围之内
{
dp[x1][x2] = max(max(dp[x1][x2], dp[x1-][x2-]),
max(dp[x1-][x2], dp[x1][x2-]))
+ map[x1][k-x1] + map[x2][k-x2];
}
}
}
}
return dp[m-][m-];
} int main()
{
int x;
scanf("%d", &x);
while (x--) {
int m, n;
scanf("%d %d", &m, &n); for (int i = ;i < m; i++)
for (int j = ; j < n; j++)
scanf("%d", &map[i][j]); int ans = maxPath(m, n);
printf("%d\n", ans);
} return ;
}
南阳OJ 61 传纸条(一)的更多相关文章
- nyoj 61 传纸条
点击打开链接 传纸条(一) 时间限制:2000 ms | 内存限制:65535 KB 难度:5 描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做 ...
- nyoj 61——传纸条(一)——————【双线dp】
传纸条(一) 时间限制:2000 ms | 内存限制:65535 KB 难度:5 描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行 ...
- nyoj 题目61 传纸条
传纸条(一) 时间限制:2000 ms | 内存限制:65535 KB 难度:5 描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行 ...
- NYOJ 61传纸条(一) 双线程DP问题
http://www.cnblogs.com/HpuAcmer/archive/2012/05/06/2486591.html 题目链接:http://acm.nyist.net/JudgeOnlin ...
- nyist 61 传纸条 nyist 712 探 寻 宝 藏(双线程dp问题)
http://acm.nyist.net/JudgeOnline/problem.php?pid=61 http://acm.nyist.net/JudgeOnline/problem.php?pid ...
- NYOJ 61 传纸条(一)
双线DP #include<iostream> #include<algorithm> #include<ctype.h> #include<string&g ...
- 【南阳OJ分类之语言入门】80题题目+AC代码汇总
小技巧:本文之前由csdn自动生成了一个目录,不必下拉一个一个去找,可通过目录标题直接定位. 本文转载自本人的csdn博客,复制过来的,排版就不弄了,欢迎转载. 声明: 题目部分皆为南阳OJ题目. 代 ...
- tyvj1011 传纸条
背景 NOIP2008复赛提高组第三题 描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端, ...
- NOIP2008 传纸条
题目描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸运的是 ...
随机推荐
- windchill系统——开发_生命周期状态的增加
步骤如下 ResourceBuild wt.lifecycle.StateRB ant -f codebase/MakeJar.xml 这样就可以了,下面是查看
- thinkphp5新特性
1.惰性加载(需要什么就加载什么,不需要什么就不加载),显著提高了应用性能: 2.支持composer: 3.遵守PSR-2.PSR-4规范: 4.支持单元测试: 5.安全机制,详细的日志能帮你轻轻松 ...
- 分享:自定义JAVA注解
元注解 元注解指用来定义注解的注解,例如:@Retention @Target Inherited @Documented等等.最为重要和经常使用的是@Retention @Target. @Rete ...
- Button实现图文混排
Button实现图文混排 一.简介 本文介绍两种图文混排方式 1.android:drawableTop="@drawable/star"实现文字上有图片 当然有上下左右等等 2. ...
- HTML5 地理定位 【来自百度应用分享平台】
百度给的地图API接口相当完善,复制过来一下,以后备用 基本使用方法: <!--引入百度地图API--> <scriptsrc="http://api.map.baidu. ...
- javascript HTML DOM 简单介绍
JavaScript HTML DOM通过 HTML DOM,可访问 JavaScript HTML 文档的所有元素.HTML DOM (文档对象模型)当网页被加载时,浏览器会创建页面的文档对象模型( ...
- delete 与 delete []的区别
一. 针对类class,这两种方式的效果是不同的. 当你通过下列方式分配一个类对象数组: class A { private: char *m_cBuffer; int ...
- openvswitch的原理和常用命令
一.Openvswitch工作原理 openvSwitch是一个高质量的.多层虚拟交换机,使用开源Apache2.0许可协议,由 Nicira Networks开发,主要实现代码为可移植的C代码.它的 ...
- ionic2——开发利器之Visual Studio Code 常用快捷键
主命令框 F1 或 Ctrl+Shift+P: 打开命令面板.在打开的输入框内,可以输入任何命令,例如: 按一下 Backspace 会进入到 Ctrl+P 模式 在 Ctrl+P 下输入 > ...
- sqlserver数据库脱机时发生异常:由于无法在数据库 'SMS' 上放置锁,ALTER DATABASE 失败。请稍后再试。 ALTER DATABASE 语句失败。 (.Net SqlClient Data Provider)
sqlserver数据库脱机时发生异常,如下: =================================== 设置脱机 对于 数据库“SMS”失败. (Microsoft.SqlServe ...