最大连续和(子串)

青旅半醒 2024-04-17 05:22 131阅读 0赞

用了4种方法实现:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const ll maxn=1e5+10;
  5. const ll mod=1e9+7;
  6. int a[10000],b[10000],c[10000];
  7. int n = 1000,t1 = 0,t2 = 0,t3 = 0,t4 = 0;
  8. void init(){
  9. for(int i = 1;i <= n;i++){
  10. a[i] = i;
  11. }
  12. }
  13. //O(n^3)
  14. int baoli(){
  15. int ans = 0;
  16. for(int i = 1;i <= n;i++){
  17. for(int j = i+1;j <= n;j++){
  18. int sum = 0;
  19. for(int k = i;k <= j;k++) {sum += a[k];t1++;}
  20. ans = max(ans,sum);
  21. }
  22. }
  23. return ans;
  24. }
  25. //O(n^2)
  26. int qzh(){
  27. int ans = 0;
  28. b[1] = a[1];
  29. for(int i = 2;i <= n;i++) {b[i] = b[i-1]+a[i];t2++;}
  30. for(int i = 1;i <= n;i++){
  31. for(int j = i+1;j <= n;j++){
  32. ans = max(ans,b[j]-b[i-1]);
  33. t2++;
  34. }
  35. }
  36. return ans;
  37. }
  38. //O(n)
  39. int qzh_plus(){
  40. int ans = 0;
  41. b[1] = a[1];c[1] = a[1];
  42. for(int i = 2;i <= n;i++) {b[i] = b[i-1]+a[i];t4++;}
  43. for(int i = 2;i <= n;i++) {c[i] = b[c[i-1]]>b[i]?i:c[i-1];t4++;}
  44. for(int i = 1;i <= n;i++){
  45. ans = max(ans,b[i]-b[c[i]-1]);
  46. }
  47. return ans;
  48. }
  49. //O(nlogn)
  50. int fenzi(int x,int y){
  51. if(y == x){
  52. return a[x];
  53. }
  54. int mid = (x+y)/2;t3++;
  55. int ans = max(fenzi(x,mid),fenzi(mid+1,y));
  56. int le = 0,rt = 0,temp = 0;
  57. for(int i = mid;i >= x;i--) {le = max(le,temp+=a[i]);t3++;}
  58. temp = 0;
  59. for(int i = mid+1;i <= y;i++) {rt = max(rt,temp+=a[i]);t3++;}
  60. ans = max(ans,le+rt);
  61. return ans;
  62. }
  63. int main()
  64. {
  65. ios::sync_with_stdio(0);
  66. cin.tie(0);
  67. init();
  68. cout<<"baoli = "<<baoli();
  69. cout<<" t1 = "<<t1<<endl;
  70. cout<<"qzh = "<<qzh();
  71. cout<<" t2 = "<<t2<<endl;
  72. cout<<"fenzi = "<<fenzi(1,n);
  73. cout<<" t3 = "<<t3<<endl;
  74. cout<<"plus = "<<qzh_plus();
  75. cout<<" t4 = "<<t4<<endl;
  76. return 0;
  77. }

20190821233552711.png

前面的数字是答案,后面的 t 是计算加法的运行次数。

发表评论

表情:
评论列表 (有 0 条评论,131人围观)

还没有评论,来说两句吧...

相关阅读

    相关 连续

    题描述: 给定一个由数字组成的数组,求出和最大的子数组 求解方法: 1.暴力法 选取所有连续和的可能性,O(n^2) 2.分析法 当遍历到第i个元素时,判断在...

    相关 连续序列

    HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。