我被分配了一个“项目”,在那里我应该创建一个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。
提前谢谢大家。
答案 0 :(得分:2)
这是解决方案:
迭代第一个子阵列的 end
迭代第二个子数组的开始,但是从第一个子数据库的末尾开始。 AR。 + 1
我们有sum of numbers on interval from 0 to *end* = prefix[end]
,但我们只对区间[end - k, k],
感兴趣,因此只需减去prefix[end] - prefix[end - k - 1]
[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;
}