最大子段和

2021-06-25 22:32:15 字數 1260 閱讀 3545

/*

再給頂的n個數的陣列中選出連續的若干個數,使得他們的和是最大的,即最大連續自序列和.

列如.序列. 1 -2 3 -1 6 -5 9

結果 當取子串行 3,-1,6,-5,9 結果12

我的思路.

1.最大連續子串行的開頭是在1...n之中.的最大連續和

2.求出以i,開頭的最大連續和,此時開頭已經確定了,那麼通過列舉結尾j[i,j]之間記錄最大連續的i->j的和max[i]

3.在所有以i開頭的連續最大和中求出最大的乙個即可.

*/#include #define maxn 100

int get_max(int a,int b)

int main(),a[maxn];

int i,n;

for(scanf("%d",&n),i=1;i<=n;i++) scanf("%d",&a[i]);

for(i=1;i<=n;i++)

}for(i=1;i<=n;i++) n=get_max(n,max[i]);

printf("%d \n",n);

return 0;

}

/*

* *問題:給出n個數子,求出其中連續的最大和從i,j 的和是 a[i]+a[i+1]+.......a[j]

* *這是經典的動態規劃題目

*問題:是求n個數字的其中的連續n個最大數的和.

*最大連續的數字和的結尾一定是1...n中的乙個.

*因此我們只需要求出這樣的d[i](以a[i]為結尾的最大連續和),d[i]的的出現可能是

*1.d[i-1]+a[i],(將a[i],放到i-1為結尾的位置,的後面).

*2.以a[i]開頭,且以a[i],結尾

*我們要在上面兩者求出乙個較大的.做為以a[i]為結尾最大的連續子串行之和(在這裡a,序列的子串行包含本身)

*將以任意元素作為結尾的連續子串行何求出來後,在其中選出乙個最大的.

*序列的開頭為什麼不用判斷呢,這是因為隱含到了d[i]中(即在得到d[i]是已經作出了選擇即為上述的1,2過程)

*/#include #define maxn 1001

int main();

int d[maxn]=,i,n,max=-0xffffff;

scanf("%d",&n);

for(i=1;i<=n;i++)

printf("%d\n",max);

return 0;

}

最大子段和

設a 是n個整數的序列,稱為該序列的子串行,其中1 i j n.子串行的元素之和稱為a的子段和.例如,a 2,11,4,13,5,2 那麼它的子段和是 長度為1的子段和 2,11,4,13,5,2 長度為2的子段和 9,7,9,8,7 長度為3的子段和 5,20,4,6 長度為4的子段和 18,15...

最大子段和

問題表述 n個數 可能是負數 組成的序列a1,a2,an.求該序列 例如 序列 2,11,4,13,5,2 最大子段和 11 4 13 20。1 窮舉演算法 o n3 o n2 2 分治法 將序列a 1 n 從n 2處截成兩段 a 1 n 2 a n 2 1 n 例項 三 最大子段和 問題表述 n個...

最大子段和

問題描述 給定有n個整數 可能為負整數 組成的序列,a1,a2,an,求該序列如 最優值為 max上述假定的意思也就是說最大欄位和 只有乙個字段 要麼為0,要麼大於0 int maxsum int n,int a,int besti,int bestj 這樣下來就可以在i 1時找到其中的最大欄位和的...