首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

动态规划经典题目——最大子矩阵和

  • 25-03-07 18:21
  • 2262
  • 13487
blog.csdn.net

一、题目

题目描述:现给出一个N*N矩阵,要求求出拥有最大和的子矩阵的和。例子如下图所示:

它的最大子矩阵的和为15;

二、解题思路

     此题的解法与动态规划经典题目——最大连续子序列之和题目思想一样,只不过本题是二维空间上的拓展。N*N矩阵用二维数组a[N][N]表示。我们解决新问题的方法是借鉴我们以前解决过的类似问题的方法和思路,当然本题也不例外,通过思考可以发现,这道题目与动态规划经典题目——最大连续子序列之和非常相似,只不过动态规划经典题目——最大连续子序列之和它是一维的问题,而本题目是二维问题,我们是否能把二维问题转化为一维问题吗?通过认真的考虑是可以的,我们可以把每列的元素进行合并为一个元素(可以定义二维数组sum[][],其中sum[i]表示前i行每列数字相加的和,所以sum[j][] - sum[i][]为一维向量),这样运用动态规划经典题目——最大连续子序列之和的思想了。

①定义状态

根据上面的分析,我们定义二维数组dp[i][j]表示第i行到第j行中的最大子矩阵和。所以我们要求的最大子矩阵和为max(dp[i][j])其中0≤i≤j≤N;

②定义状态转移方程

大家知道动态规划满足无后向性,即:每个阶段的决策仅受之前决策的影响,但是不影响之后各阶段的决策。所以我们可以从后往前推出状态转移方程,具体定义可参考动态规划经典题目——最大连续子序列之和中的状态转移方程。

三、代码编写

  1. #include
  2. #include
  3. #define N 4
  4. #define max(a,b) ((a > b)?a:b)
  5. int main()
  6. {
  7. //定义矩阵
  8. int a[N][N] = { {0,-2,-7,0},
  9. {9,2,-6,2},
  10. {-4,1,-4,1},
  11. {-1,8,0,-2}};
  12. //定义二维数组sum[][],其中sum[i]表示前i行每列数字相加的和,
  13. //所以sum[j][] - sum[i][]为一维向量
  14. int sum[N+1][N] = {0};
  15. int temp = 0 ;
  16. //保存最大子矩阵和
  17. int maxResult = 0;
  18. //给sum数组赋值
  19. int i,j,k;
  20. for(i=1 ; i < N+1 ; i++){
  21. for(j=0 ; j < N ; j++){
  22. sum[i][j] = sum[i-1][j] + a[i-1][j];
  23. }
  24. }
  25. //核心算法
  26. for(i=0 ; i < N ; i++){
  27. for(j=i+1 ; j < N+1 ; j++){
  28. temp = 0 ;
  29. for(k=0 ; k < N ; k++){
  30. temp += (sum[j][k] - sum[i][k]);
  31. if(temp > maxResult){
  32. maxResult = temp;
  33. }
  34. if(temp < 0){
  35. temp = 0;
  36. }
  37. }
  38. }
  39. }
  40. printf("最大子矩阵和为:%d",maxResult);
  41. return 0;
  42. }

 四、运行结果

 

文章知识点与官方知识档案匹配,可进一步学习相关知识
算法技能树首页概览64430 人正在系统学习中
注:本文转载自blog.csdn.net的仁者乐山智者乐水的文章"https://blog.csdn.net/qq_39559641/article/details/98721603"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top