Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++子序列练习 我被分配了一个项目,我应该创建一个C++程序来找到两个子序列中最大可能的和。用户输入N个数组长度、每个子序列的K个长度和表示数组的N个数字。两个子序列可以接触,但不能相互覆盖,例如,1 5 20 20 20 15 10 1 1 1 1应输出90 5+20+20+15_10,而不是115 20+20+20+20+20+15_C++_Arrays_Algorithm - Fatal编程技术网

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

C++子序列练习 我被分配了一个项目,我应该创建一个C++程序来找到两个子序列中最大可能的和。用户输入N个数组长度、每个子序列的K个长度和表示数组的N个数字。两个子序列可以接触,但不能相互覆盖,例如,1 5 20 20 20 15 10 1 1 1 1应输出90 5+20+20+15_10,而不是115 20+20+20+20+20+15,c++,arrays,algorithm,C++,Arrays,Algorithm,到目前为止,我的代码是: #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

到目前为止,我的代码是:

#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;
}
这仅在两个子序列不相互干扰的情况下是正确的,例如在输出71的阵列中,如2 4 15 12 10 1 1 20 4 10

提前感谢大家。

这是一个解决方案:

预先计算前缀和后缀 迭代第一个子数组的结尾

迭代第二个子阵列的开始,但从第一个子阵列的结尾开始。ar.+1

我们有从0到*end*=前缀[end]的区间数之和,但我们只对区间[end-k,k]感兴趣,所以只需减去前缀[end]-前缀[end-k-1]

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

第二个子阵列采用相同的方法:sum2=后缀[begin]-后缀[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;
}

我不太明白。你能更详细地解释一下你当前的代码在哪些情况下工作和不工作吗?当然,在N=10 K=3数组=2 4 15 12 10 1 20 4 10的情况下,我的代码工作并有效地输出71 15+12+10+20+4+10。但是,在N=10 K=3数组=1 5 20 20 20 15 10 1 1 1的情况下,我的数组不工作,因为它在两个不同的子序列中使用相同的数字,并输出115而不是90。请不要故意破坏您的问题。