南阳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列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸运的是 ...
随机推荐
- tomcat绿色版——运行一闪而过的解决方法
首先配置好jdk的环境变量 %JAVA_HOME%\bin;注意:一定是英文状态下的分号结尾 %TOMCAT%\bin;注意:一定是英文状态下的分号结尾 service.bat install ser ...
- 关于eclipse中看不到源码的问题
这几步之后会生成一个src压缩包,再用att打开即可.记住 要按ctrl再点击
- LeetCode第[7]题(Java):Reverse Integer 标签:数学
题目:Reverse Integer 难度:Easy 题目内容: Given a 32-bit signed integer, reverse digits of an integer. Note:A ...
- css 中的background:transparent到底是什么意思有什么作用
有时我在看css时,看到有的css属性定义为background:transparent.意思就是背景透明.实际上background默认的颜色就是透明的属性.所以写和不写都是一样的 有段时间没写文章 ...
- 英语每日阅读---3、VOA慢速英语(翻译+字幕+讲解):哈佛大学被控歧视亚裔学生
英语每日阅读---3.VOA慢速英语(翻译+字幕+讲解):哈佛大学被控歧视亚裔学生 一.总结 一句话总结:Harvard Accused of Discriminating Against Asian ...
- 更新增加一个门店ID字段的值
MYSQL因为不能查询一张表时同时更新一张表,同时又会有子查询大于等于一条的情况出现. 分两种情况: 1 直接JOIN 得到一张表. 然后导出做筛选 CREATE TABLE TEST SELECT ...
- opencv:傅里叶变换
示例代码: #include <opencv.hpp> #include <iostream> using namespace std; using namespace cv; ...
- MVC框架中的值提供机制(二)
在MVC框架中存在一些默认的值提供程序模板,这些值提供程序都是通过工厂模式类创建;在MVC框架中存在需要已Factory结尾的工厂类,在值提供程序中也存在ValueProviderFactories工 ...
- Arcgis for Js实现graphiclayer的空间查询
本节讲的是Arcgis for Js的针对graphiclayer的空间查询,内容很简单,代码如下: <!DOCTYPE html> <html> <head> & ...
- Java 对称加密
最近在做一个用户 token 功能,学习了加密相关 AES/DES.RSA 等.其中涉及一个对称和非对称加密问题.对称加密虽然没有非对称加密那样安全性高,但好处是加密速度快,但某些场合还是可以选择使用 ...