題目:
輸入一個(gè)整形數(shù)組,數(shù)組里有正數(shù)也有負(fù)數(shù)。
數(shù)組中連續(xù)的一個(gè)或多個(gè)整數(shù)組成一個(gè)子數(shù)組,每個(gè)子數(shù)組都有一個(gè)和。
求所有子數(shù)組的和的最大值。要求時(shí)間復(fù)雜度為O(n)。
例如輸入的數(shù)組為1, -2, 3, 10, -4, 7, 2, -5,和最大的子數(shù)組為3, 10, -4, 7, 2,
因此輸出為該子數(shù)組的和18。
找到狀態(tài)轉(zhuǎn)移方程,dp[i]表示前i個(gè)數(shù)中,包含i的子數(shù)組的最大和。要么第i個(gè)數(shù)自己最大,要么他要和包含i-1的子數(shù)組最大和(即dp[i-1])聯(lián)合在一起.
即dp[i] = max{arr[i],dp[i-1]+arr[i]};
代碼如下;
int res(int* arr, int len){
//學(xué)到一個(gè)定義最小數(shù)的方法:)
int max = -(1<<31);
int i;
for(i=1;i<len;i++){
arr[i] = max(arr[i],arr[i-1]+arr[i]);
if(max < arr[i]) max = arr[i];
}
return max;
}
int main(){
int arr[] = {1,-2,3,10,-4,7,2,-5};
printf("%d/n",res(arr,8));
return 0;
}
|
新聞熱點(diǎn)
疑難解答
圖片精選