我陷入了一個算法問題。請爲下面的問題建議一些有效的算法。查找一個數組的子數組,其數目除以給定的數字
問題是子陣列,其總和爲給定數整除的
查找號碼。
我的工作
我由一種算法,其複雜度爲O(N^2),這裏,N =大小的陣列組成。
我的代碼
#include<stdio.h>
using namespace std;
main() {
int N;
int P;
int T;
int val;
long long int count = 0;
long long int answer = 0;
scanf("%d", &T);
//T = 20;
for(int k = 1; k <= T; k++) {
scanf("%d", &N);
scanf("%d", &P);
count = 0;
answer = 0;
for(int i = 0; i < N; i++) {
scanf("%d", &val);
count += val;
workingArray[i] = count;
}
for(int length = 1; length <= N; length++) {
for(int start = 0; start <= (N-length); start++) {
if(start == 0) {
if(workingArray[start+length-1]%P == 0) answer++;
}
else if((workingArray[start+length-1] - workingArray[start-1])%P == 0) answer++;
}
}
printf("Case #%d\n%lld\n", k, answer);
}
return 0;
}
你寫的代碼到底是什麼問題? –
我認爲你的解決方案跳過了很多可能的組合......你只在這裏檢查相鄰元素的總和(除非你在問題中定義了「子數組」) – Ashalynd
@Ashalynd「子數組」通常指該數組(例如[最大子數組問題](http://en.wikipedia.org/wiki/Maximum_subarray_problem))。對於非連續部分,通常談論「子集」(例如[子集總和問題](http://en.wikipedia.org/wiki/Subset_sum_problem))。 – Dukeling