计蒜客 难题题库 210 矩阵游戏

在一个m行n列的矩阵中,寻找从左上角到右下角及从右下角到左上角的两条路径,使得这两条路径上的节点值(代表好心程度)之和最大。采用动态规划的方法解决该问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题。一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了。幸运的是,他们可以通过传纸条来进行交流。纸条要经由许多同学传到对方手里,小渊坐在矩阵的左上角,坐标(1,1),小轩坐在矩阵的右下角,坐标(m,n)。从小渊传到小轩的纸条只可以向下或者向右传递,从小轩传给小渊的纸条只可以向上或者向左传递。 在活动进行中,小渊希望给小轩传递一张纸条,同时希望小轩给他回复。班里每个同学都可以帮他们传递,但只会帮他们一次,也就是说如果此人在小渊递给小轩纸条的时候帮忙,那么在小轩递给小渊的时候就不会再帮忙。反之亦然。 还有一件事情需要注意,全班每个同学愿意帮忙的好感度有高有低(注意:小渊和小轩的好心程度没有定义,输入时用0表示),可以用一个0-100的自然数来表示,数越大表示越好心。小渊和小轩希望尽可能找好心程度高的同学来帮忙传纸条,即找到来回两条传递路径,使得这两条路径上同学的好心程度只和最大。现在,请你帮助小渊和小轩找到这样的两条路径。

输入文件message.in的第一行有2个用空格隔开的整数m和n,表示班里有m行n列(1< =m,n< =50)。 接下来的m行是一个m*n的矩阵,矩阵中第i行j列的整数表示坐在第i行j列的学生的好心程度。每行的n个整数之间用空格隔开。

输出文件message.out共一行,包含一个整数,表示来回两条路上参与传递纸条的学生的好心程度之和的最大值。

30%的数据满足:1< =m,n< =10  100%的数据满足:1< =m,n< =50

样例1

输入:

3 3
0 3 9
2 8 5
5 7 0

输出:

34


#include<iostream>
using namespace std;

const int maxn = 51;
int mp[maxn][maxn];
int dp[maxn * 2][maxn][maxn];   
// dp[k][i][j] 表示一共走了 k 步,一条路走到 (i, k - i) 步,另一条走到(j, k - j)。

int main(){
    int m, n;
    cin >> m >> n;
    int i, j;
    for(i = 1; i <= m; ++i){
        for(j = 1; j <= n; ++j){
            cin >> mp[i][j];
        }
    }
    int k;
    for(k = 3; k < m + n; ++k){
        for(i = max(1, k - n); i <= m && i < k; ++i){
            for(j = max(i + 1, k - n); j <= m && j < k; ++j){      // j > i 保证不重复
                dp[k][i][j] =   mp[i][k - i] + mp[j][k - j] +
                                max(max(dp[k - 1][i][j], dp[k - 1][i - 1][j - 1]),
                                    max(dp[k - 1][i][j - 1], dp[k - 1][i - 1][j]));
            }
        }
    }
    int t = m + n;  // 因为 j > i,所以dp[m + n][m][m] 需要单独计算
    dp[t][m][m] = max(max(dp[t - 1][m][m], dp[t - 1][m - 1][m - 1]),
                      max(dp[t - 1][m - 1][m], dp[t - 1][m][m - 1]));
    cout << dp[t][m][m] << endl;
}


### C语言竞赛题库 为了帮助准备C语言竞赛,这里提供了50道精选的练习题目。这些题目涵盖了基础语法、数据结构、算法等多个方面。 #### 题目列表 1. 编写一个函数来算两个整数的最大公约数。 2. 实现快速排序算法并测试其性能。 3. 使用递归方法实现斐波那契数列。 4. 设一个栈的数据结构,并实现基本操作如入栈和出栈。 5. 创建一个队列,并完成相应的入队和出队功能。 6. 定义链表节点结构体,编写代码初始化链表以及遍历打印所有元素。 7. 给定字符串数组,找出其中最长公共前缀。 8. 输入一组数字,判断是否存在重复项。 9. 算阶乘的结果。 10. 判断给定年份是否为闰年。 11. 将十进制转换成二进制表示形式。 12. 找到数组中的最大值及其索引位置。 13. 对字符进行加密解密处理(凯撒密码)。 14. 检查输入的括号序列是否合法匹配。 15. 查找二维矩阵中最短路径长度。 16. 构建哈希表存储键值对关系。 17. 解决经典的八皇后问题。 18. 复杂度分析:给出一段代码的时间复杂度O(nlogn)解释说明。 19. 动态规划求解背包问题最优方案。 20. 字符串模式匹配KMP算法的应用实例。 21. 广度优先搜索BFS解决迷宫寻路难题。 22. 深度优先搜索DFS探索图连通分量数量。 23. 堆排序HeapSort的具体实现过程。 24. 合并k个有序链表成为新的升序排列。 25. 位运算技巧用于奇偶性检测。 26. 排列组合生成器,列举指定范围内所有的可能情况。 27. 数字反转后的平方根取整比较原数值大小。 28. 贪心策略选取最多不相交区间数目。 29. 双指针法优化两数之和查找效率。 30. LRU缓存淘汰机制的设思路分享。 31. Trie树构建单词自动补全系统框架。 32. Bloom过滤器原理介绍及简单应用案例。 33. RSA公钥私钥体系下的消息签名验证流程。 34. Boyer-Moore字符串搜索算法特点总结。 35. Morris遍历红黑树特性讲解与实践演练。 36. A*启发式最短路径寻找算法解析。 37. Manacher马拉车算法高效回文子串定位。 38. Suffix Array后缀数组加速文本检索速度。 39. Segment Tree线段树支持动态范围查询更新。 40. Fenwick Tree树状数组维护累积频率统。 41. Hopcroft-Karp二部图最大匹配算法描述。 42. Ford-Fulkerson网络流增广路定理证明推导。 43. Edmonds-Karp最小费用最大流模型建立。 44. Dinic预流推进算法改进版Dinic算法阐述。 45. Kosaraju强联通分支Tarjan缩点技术探讨。 46. Tarjan离线LCA最近公共祖先询问解答。 47. Prufer编码解码无向树形态变换规律研究。 48. Cartesian Tree笛卡尔树性质归纳整理。 49. Treap随机化平衡二叉查找树概念引入。 50. Skip List跳跃表替代传统RBTree解决方案评估。 以上每一道题目都旨在考察不同的知识点和技术要点,在实际编程过程中能够加深理解掌握核心技能[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值