南阳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列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸运的是 ...
随机推荐
- Windows安装Ubuntu桌面操作系统到移动硬盘中以及错误解决
用到的工具:U盘一个(usb3.0,你懂的),移动硬盘(我这个是笔记本里面取出来的机械硬盘装上的盒子) 第一步:下载Ubuntu系统iso镜像文件 下载Ubuntu系统iso镜像文件,由于我是新手,下 ...
- 项目中如何使用EF
本文将在技术层面挑战园子里的权威大牛们,言语不敬之处敬请包涵.本文旨为技术交流,欢迎拍砖. 园子里面分享和推荐Entity Framework(以下简称EF)的Repository(仓储)设计模式的文 ...
- Mac 终端 Termial 高亮配置(PS1变量配置)
操作环境: 系统:Mac 10.12 编辑器:vim 一.无脑配置: 1. 打开中端输入: vi ~/.bash_profile 2. 打开并编辑 .bash_profile 文件: 按键盘“i”,进 ...
- yii2: oralce中文,有的汉字是2个字节,有的汉字是3个字节
yii2: oralce中文,有的汉字是2个字节,有的汉字是3个字节 请用mb_substr转成1个英文字节
- 【转】Java设计模式-单例模式详解
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6510196.html 所谓单例,指的就是单实例,有且仅有一个类实例,这个单例不应该由人来控 ...
- IE兼容性测试工具IETester
IE兼容性测试工具:IETester 1.这种做法,不能做到100%的覆盖: 2.实际的业务场景会比IEtester更符合.
- hdu 5981 Guess the number
Guess the number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 160000/160000 K (Java/Other ...
- 【scala】Option类型
一般来说,对于每种语言都会有一个关键字来表示一个对象引用的“无”.在Java中使用的是null. 而Scala则融合了函数式编程的风格,当预计到变量或者函数返回值可能不会引用任何值的时候,使用Opti ...
- 【lightoj-1094】树的直径(DFS)
链接:http://www.lightoj.com/volume_showproblem.php?problem=1094 题意: 一共n各节点编号0-n-1, 输入n-1条无向边代表u-v距离为w, ...
- 【python】numpy pandas 特性(随时更新)
[value map] 用df.replace(dict)可以解决.但是如果dict太大,会非常非常慢. [array相加的维度规律][广播] (2,3) 能和 (3,) 相加,不能和(2,)相加 ( ...