poj 1050 To the Max(最大子矩阵之和)

举报
xindoo 发表于 2022/04/16 01:50:14 2022/04/16
【摘要】 http://poj.org/problem?id=1050        我们已经知道求最大子段和的dp算法 参考 here  也可参考编程之美有关最大子矩阵和部分。       然后将这个扩大到二维就是这道题。顺便说一下,有时候不要把问题想复杂了,有...

http://poj.org/problem?id=1050

       我们已经知道求最大子段和的dp算法 参考 here  也可参考编程之美有关最大子矩阵和部分。

      然后将这个扩大到二维就是这道题。顺便说一下,有时候不要把问题想复杂了,有些问题只能靠暴力求解,而这道题是暴力加算法。

      在这个题中,我们可以把二维压缩到一维然后求解最大子段。我们先枚举所求矩阵的起点行和结束行,然后把每一列的数据之和求出,用这些数据和就构造出一个一维的数组(代码中我没有明确表示出这个数组),然后用最大子段和的dp算法求解。

     关于二维压缩到一维的过程,适当处理可以大大减小时间复杂度。

     最终时间复杂度是O(n^3);

我的代码,思路是正确的,但是提交上去之后wa了,求大神赐教。


  
  1. //2013-06-26-08.45
  2. //poj 1050
  3. #include <iostream>
  4. #include <string.h>
  5. #include <algorithm>
  6. int map[103][103];
  7. int sum[103][103];
  8. using namespace std;
  9. int main()
  10. {
  11. int n;
  12. while (cin >> n)
  13. {
  14. memset(sum, 0, sizeof(sum));
  15. for (int i = 1; i <= n; i++)
  16. {
  17. for (int j = 1; j <= n; j++)
  18. {
  19. cin >> map[i][j];
  20. sum[i][j] = map[i][j] + sum[i-1][j];
  21. }
  22. }
  23. int ans = 0;
  24. for (int i = 1; i <= n; i++)
  25. {
  26. for (int j = 0; j < i; j++)
  27. {
  28. int tol = 0;
  29. for (int k = 1; k <= n; k++)
  30. {
  31. if (sum[i][k]-sum[j][k] < 0) //这个地方就是压缩后的数组
  32. tol = 0;
  33. else
  34. tol += (sum[i][k]-sum[j][k]);
  35. if (tol > ans)
  36. ans = tol;
  37. }
  38. }
  39. }
  40. cout << ans << endl;
  41. }
  42. return 0;
  43. }


文章来源: xindoo.blog.csdn.net,作者:xindoo,版权归原作者所有,如需转载,请联系作者。

原文链接:xindoo.blog.csdn.net/article/details/9176155

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。