1、2维最大子段和

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #define MAX 1000
  5. int MaxSubInterval(int a[], int n) //标准的一维最大子段和
  6. {
  7. int sum = 0, tp = 0;
  8. for(int i=0; i<n; i++)
  9. {
  10. if(tp > 0)
  11. tp += a[i];
  12. else
  13. tp = a[i];
  14. if(sum < tp)
  15. sum = tp;
  16. }
  17. return sum;
  18. }
  19. int MaxSubMartix(int a[][MAX], int m, int n) //二维最大子段和问题
  20. {
  21. int tp[MAX], sum = 0;
  22. for(int i=0; i<m; i++)
  23. {
  24. memset(tp, 0, sizeof(tp) );
  25. for(int j=i; j<m; j++)
  26. {
  27. for(int k=0; k<n; k++)
  28. tp[k] += a[j][k];
  29. int max = MaxSubInterval(tp, n);
  30. if(max > sum) sum = max;
  31. }
  32. }
  33. return sum;
  34. }
  35. /*
  36. int MaxSubInterval(int a[], int n, int size_y) //一维的n个数的最大子段和
  37. {
  38. int sum = 0, tp;
  39. for(int i=0; i<n-size_y; i++)
  40. {
  41. tp = 0;
  42. for(int j=i; j<i+size_y; j++)
  43. {
  44. if(tp > 0)
  45. tp += a[j];
  46. else
  47. tp = a[j];
  48. }
  49. if(sum < tp)
  50. sum = tp;
  51. }
  52. return sum;
  53. }
  54. int MaxSubMartix(int a[][MAX], int m, int n, int size_x, int size_y) //二维size_x * size_y 个数的最大子段和
  55. {
  56. int tp[MAX], sum = 0;
  57. for(int i=0; i<m-size_x; i++)
  58. {
  59. memset(tp, 0, sizeof(tp) );
  60. for(int j=i; j<i+size_x; j++)
  61. {
  62. for(int k=0; k<n; k++)
  63. tp[k] += a[j][k];
  64. }
  65. int max = MaxSubInterval(tp, n, size_y);
  66. if(max > sum) sum = max;
  67. }
  68. return sum;
  69. }
  70. */





附件列表

    原文地址:https://www.cnblogs.com/sober-reflection/p/61b4f77e8e98092b5ec2d10a54d04c9e.html