C ++子序列练习

时间:2016-02-11 18:49:55

标签: c++ arrays algorithm

我被分配了一个“项目”,在那里我应该创建一个C ++程序来找到两个子序列的最大可能总和。用户输入N(阵列长度),K(每个子序列的长度)和表示该阵列的N个数字。两个子序列可以触摸但不能互相覆盖,例如1 5 20 20 20 15 10 1 1 1应输出90((5 + 20 + 20)+(20 + 15_10))而不是115((20 + 20 + 20)+(20 + 20 + 15))。

我的代码到现在为止:

#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;

int main()
{
   int N, K, MaxN;
   cin >> N;
   cin >> K;
   int Pi[N];
   MaxN = N - K + 1;
   int Word[MaxN];
   int MaxSum;

   for(int nn=0; nn<N; nn++) {
      cin >> Pi[nn];
   }

   for(int y=0;y<MaxN;y++) {
      Word[y] = 0;
   }

   for(int j=0; j<MaxN; j++) {
      for(int l=0; l<K; l++) {
         Word[j] = Word[j] + Pi[j+l];  
      }
   }

   sort(Word, Word + MaxN);
   MaxSum = Word[MaxN-2] + Word[MaxN-1];
   cout << MaxSum;

   return 0;
}

仅在2个子序列不相互干扰的情况下才是正确的,例如在诸如2 4 15 12 10 1 1 20 4 10的阵列中输出71。

提前谢谢大家。

1 个答案:

答案 0 :(得分:2)

这是解决方案:

  1. 预先计算前缀和后缀
  2. 迭代第一个子阵列的 end

    迭代第二个子数组的开始,但是从第一个子数据库的末尾开始。 AR。 + 1

    我们有sum of numbers on interval from 0 to *end* = prefix[end],但我们只对区间[end - k, k],感兴趣,因此只需减去prefix[end] - prefix[end - k - 1]

  3.   

    [0 .. end-k-1,end-k .. end]

    第二个子阵列采用相同的方法:sum2 = suffix[begin] - suffix[begin + i + 1]

    然后与之前的答案进行比较

    因此,我们只是强制所有可能不相交的子阵列,并找到最大值和

    #include <cstdlib>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    
    int main()
    {
        int N,K,MaxN;
        cin >> N;
        cin >> K;
        int Pi[N];
        MaxN=N-K+1;
        int Word[MaxN];
        int MaxSum;
    
        for(int nn=0;nn<N;nn++){
            cin >> Pi[nn];
        }
    
        int prefix[N];
        int sufix[N];
        for (int i = 0; i < N; i++) {
            prefix[i] = sufix[i] = 0;
        }
    
        for (int i = 0; i < N; i++) {
            if (i == 0)
                prefix[i] = Pi[i];
            else
                prefix[i] = Pi[i] + prefix[i - 1];
        }
    
        for (int i = N - 1; i >= 0; i--) {
            if (i == N - 1)
                sufix[i] = Pi[i];
            else
                sufix[i] = Pi[i] + sufix[i + 1];
        }
    
        int ans = 0;
    
        for (int i = K - 1; i < MaxN; i++) {
            for (int j = i + 1; j < MaxN; j++) {
                int x = prefix[i] - (i - K >= 0 ? prefix[i - K] : 0);
                int y = sufix[j] - (j + K < N ? sufix[j + K] : 0);
                ans = max(ans, x + y);
    
            }
        }
    
        cout << ans;
    
    
    
    
        return 0;
    }