蓝桥杯 算法训练 ALGO-36 传纸条
在活动进行中,小渊希望给小轩传递一张纸条,同时希望小轩给他回复。班里每个同学都可以帮他们传递,但只会帮他们一次,也就是说如果此人在小渊递给小轩纸条的时候帮忙,那么在小轩递给小渊的时候就不会再帮忙。反之亦然。
还有一件事情需要注意,全班每个同学愿意帮忙的好感度有高有低(注意:小渊和小轩的好心程度没有定义,输入时用0表示),可以用一个0-100的自然数来表示,数越大表示越好心。小渊和小轩希望尽可能找好心程度高的同学来帮忙传纸条,即找到来回两条传递路径,使得这两条路径上同学的好心程度只和最大。现在,请你帮助小渊和小轩找到这样的两条路径。
接下来的m行是一个m*n的矩阵,矩阵中第i行j列的整数表示坐在第i行j列的学生的好心程度。每行的n个整数之间用空格隔开。
0 3 9
2 8 5
5 7 0
100%的数据满足:1<=m,n<=50
![](https://images2017.cnblogs.com/blog/1119097/201707/1119097-20170726205539062-318071557.png)
![](https://images2017.cnblogs.com/blog/1119097/201707/1119097-20170726211948640-1325556598.png)
![](https://images2017.cnblogs.com/blog/1119097/201707/1119097-20170727101527187-110541235.png)
![](https://images2017.cnblogs.com/blog/1119097/201707/1119097-20170727101549062-1477965114.png)
#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 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 ;
}
#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 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 ;
}
#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 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 ;
}
蓝桥杯 算法训练 ALGO-36 传纸条的更多相关文章
- Java实现 蓝桥杯 算法训练 猴子吃包子(暴力)
试题 算法训练 猴子吃包子 问题描述 从前,有一只吃包子很厉害的猴子,它可以吃无数个包子,但是,它吃不同的包子速度也不同:肉包每秒钟吃x个:韭菜包每秒钟吃y个:没有馅的包子每秒钟吃z个:现在有x1个肉 ...
- Java实现蓝桥杯 算法训练 大等于n的最小完全平方数
试题 算法训练 大等于n的最小完全平方数 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 输出大等于n的最小的完全平方数. 若一个数能表示成某个自然数的平方的形式,则称这个数为完全平 ...
- 蓝桥杯算法训练 java算法 表达式求值
问题描述 输入一个只包含加减乖除和括号的合法表达式,求表达式的值.其中除表示整除. 输入格式 输入一行,包含一个表达式. 输出格式 输出这个表达式的值. 样例输入 1-2+3*(4-5) 样例输出 - ...
- 蓝桥杯 算法训练 ALGO-114 黑白无常
算法训练 黑白无常 时间限制:1.0s 内存限制:256.0MB 问题描述 某寝室的同学们在学术完之后准备玩一个游戏:游戏是这样的,每个人头上都被贴了一张白色或者黑色的纸,现在每个人都会说一句 ...
- java实现 蓝桥杯 算法训练 Password Suspects
问题描述 在年轻的时候,我们故事中的英雄--国王 Copa--他的私人数据并不是完全安全地隐蔽.对他来说是,这不可接受的.因此,他发明了一种密码,好记又难以破解.后来,他才知道这种密码是一个长度为奇数 ...
- 蓝桥杯 算法训练 Torry的困惑(基本型)(水题,筛法求素数)
算法训练 Torry的困惑(基本型) 时间限制:1.0s 内存限制:512.0MB 问题描述 Torry从小喜爱数学.一天,老师告诉他,像2.3.5.7……这样的数叫做质数.Torry突 ...
- 蓝桥杯 算法训练 区间k大数查询(水题)
算法训练 区间k大数查询 时间限制:1.0s 内存限制:256.0MB 问题描述 给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个. 输入格式 第一行包含一个数n,表示序列长度. ...
- 蓝桥杯--算法训练 区间k大数查询
算法训练 区间k大数查询 时间限制:1.0 ...
- 蓝桥杯 算法训练 ALGO-116 最大的算式
算法训练 最大的算式 时间限制:1.0s 内存限制:256.0MB 问题描述 题目很简单,给出N个数字,不改变它们的相对位置,在中间加入K个乘号和N-K-1个加号,(括号随便加)使最终结果尽量 ...
随机推荐
- AIDL与Binder的区别
Binder是一个远程对象的基础类,核心部分是远程调用机制,这部分是由IBinder定义的. 它是对IBinder类的实现,其中IBinder类提供了这样一个类的标准的本地化实现方式. 大多数开发者不 ...
- Permutations,全排列
问题描述:给定一个数组,数字中数字不重复,求所有全排列. 算法分析:可以用交换递归法,也可以用插入法. 递归法:例如,123,先把1和1交换,然后递归全排列2和3,然后再把1和1换回来.1和2交换,全 ...
- scala学习手记39 - 模式匹配
在java中有switch/case这样的模式匹配语句,可以匹配的类型包括int,byte,char,short, enum,在java8又支持了字符串. 在scala中也有类似的模式匹配语句,即ma ...
- EF6 Code First 系列 (四):SQLite的DropCreateDatabaseIfModelChanges和乐观并发控制
没什么好说的,能支持DropCreateDatabaseIfModelChanges和RowVersion的Sqlite谁都想要.EntityFramework7正在添加对Sqlite的支持,虽然EF ...
- Linux软件安装-----apache安装
一. ./configure --prefix=/usr/local/http2 \ --enable-modules=all \ --enble-mods-shared=all \ 开启模块共享: ...
- 处理跨线程操作问题(使用Action和delegate或lambda表达式)
方法A: Action f = () => { txtProcess.Text = "开始更新程序.. ...
- require.js资料
1.http://www.ruanyifeng.com/blog/2012/11/require_js.html?bsh_bid=230697246 (require.js的用法) 2.http:// ...
- 【zzulioj-2115】乘积最大(区间dp)
题目描述 今年是国际数学联盟确定的“2000——世界数学年”,又恰逢我国著名数学家华罗庚先生诞辰90周年.在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一个好朋友XZ也有幸得 ...
- 【Wannafly挑战赛10 - B】小H和密码(DP)
试题链接:https://www.nowcoder.com/acm/contest/72/B 题目描述 小H在击败怪兽后,被一个密码锁挡住了去路 密码锁由N个转盘组成,编号为1~N,每 ...
- ROS新版本Lunar Loggerhead
参考链接: 1 http://wiki.ros.org/lunar 2 http://wiki.ros.org/lunar/Installation 3 http://docs.ros.org/ 4 ...