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。请不要故意破坏您的问题。