/*
name:
author:
date: 23-03-17 08:08
description:
題目描述:
給定k個整數的序列,其任意連續子串行可表示為,
其中 1 <= i <= j <= k。最大連續子串行是所有連續子串行中元素和最大的乙個,
例如給定序列,其最大連續子串行為,最大和為20。
演算法1:
我們用乙個備忘錄陣列s[i]來記錄包括元素a[i]的最大連續子串行之和,
從左向右依次增大序列的規模,我們注意到,當處理元素a[i]時,若左側的連續子串行和s[i-1]>0,
則s[i]=s[i-1]+a[i]有可能是最優解; 若s[i-1]<0 ,則s[i]=a[i]有可能是最優解。
計算出所有的s[i]後,再遍歷一次陣列s[i],找出最大值。
演算法2:
基本思想和演算法1一樣,都是先記錄備忘錄陣列,再查詢最優解。
增加了乙個查詢左右邊界,並輸出對應連續子串行的功能。右邊界right即最優解s[i]的下標i;
左邊界根據left = right;
while (left > 0 && s[left-1] > 0)
來判斷。
演算法3:
也是用乙個備忘錄陣列s[i]來記錄包括元素a[i]的最大連續子串行之和,但是不是先記錄再查詢,
而是引入乙個臨時變數left,在記錄備忘錄陣列的同時,記錄最優解和左右邊界。
演算法4:
考慮到s[i]的值只與s[i-1]有關,無需把所有的s[i]都記錄下來,可以使用乙個變數代替備忘錄陣列,
用s代替s[i-1],記得每處理完乙個元素a[i],都要及時更新s的值。
基本思路同演算法3。
*/#include#includeusing namespace std;
int maxsubsequencesum_1(const int a, int n);//使用備忘錄陣列的動態規劃演算法
int maxsubsequencesum_2(const int a, int n);//先記錄備忘錄陣列,再查詢最優解和左右邊界
int maxsubsequencesum_3(const int a, int n);//記錄備忘錄陣列的同時,記錄最優解和左右邊界
int maxsubsequencesum_4(const int a, int n);//使用乙個變數代替備忘錄陣列,輸出子串行
const int max = 10;
int main(int argc, char **argv)
;
cout << maxsubsequencesum_1(a, max) << endl;
cout << maxsubsequencesum_2(a, max) << endl;
cout << maxsubsequencesum_3(a, max) << endl;
cout << maxsubsequencesum_4(a, max) << endl;
system("pause");
return 0;
}int maxsubsequencesum_1(const int a, int n)//使用備忘錄陣列的動態規劃演算法
;//s[i]用來儲存包含a[i]的最大連續子串行之和
for (int i=1; i0) //若之前的連續子串行之和大於0,則把a[i]累加上去
s[i] = s[i-1] + a[i];
else //否則重新開始
s[i] = a[i];
}
int max = s[0];
for (int i=1; imax)
max = s[i];
}
return max;
} int maxsubsequencesum_2(const int a, int n)//先記錄備忘錄陣列,再查詢最優解和左右邊界
;//s[i]用來儲存包含a[i]的最大連續子串行之和
for (int i=1; i0) //若之前的連續子串行之和大於0,則把a[i]累加上去
s[i] = s[i-1] + a[i];
else //否則重新開始
s[i] = a[i];
}
int max = s[0];
int left = 0, right = 0; //left和right分別儲存最大連續子串行的左右邊界
for (int i=1; imax)
}left = right; //尋找左邊界
while (left > 0 && s[left-1] > 0)
cout << "a[" << left << ":" << right << "] : ";
for (int i=left; i<=right; i++)//儲存各連續子串行的最大和
cout << "= ";
return max;
} int maxsubsequencesum_3(const int a, int n)//記錄備忘錄陣列的同時,記錄最優解和左右邊界
;//s[i]用來儲存包含a[i]的最大連續子串行之和
int max = s[0];
int left = 0, mleft = 0, right = 0; //mleft和right分別儲存最大連續子串行的左右邊界
for (int i=1; i0) //若之前的連續子串行之和大於0,則把a[i]累加上去
}else //否則重新開始
}
cout << "a[" << mleft << ":" << right << "] : ";
for (int i=mleft; i<=right; i++)//儲存各連續子串行的最大和
cout << "= ";
return max;
} int maxsubsequencesum_4(const int a, int n)//使用乙個變數代替備忘錄陣列,輸出子串行
} else //否則重新開始
}
cout << "a[" << mleft << ":" << right << "] : ";
for (int i=mleft; i<=right; i++)//儲存各連續子串行的最大和
cout << "= ";
return max;
}
最大連續子串行之和,最大連續子串行乘積
最大連續子串行之和問題描述為 陣列中里有正數也有負數,連續的乙個或多個整數組成乙個子陣列,每個子陣列都有乙個和,求所有子陣列的和的最大值。分析,對陣列a進行一遍掃瞄,sum i 為前i個元素中,包含第i個元素且和最大的連續子陣列,maxsum儲存當前子陣列中最大和,對於a i 1 來說,sum i ...
最大連續子串行之和
窮舉法思路 1,3,4,5最大子串行為4 5 9,4 2 3 5 最大子串行為4 2 3 5 10 窮舉數列的每個區間,將區間內的數相加,更新最大值,每計算乙個區間後求和的sum要清0 include main sum 0 進入下次計算sum清0 printf d max 非列舉思路 當輸入的數全為...
最大連續子串行之和
問題描述 leyni得到了乙個長度為n的序列,xiange要求leyni最多可以修改其中k個元素,每次修改的規則是只能將乙個數字修改為其相反數。leyni想知道在修改後,他能得到的所有長度為len的連續子串行中,最大的 子串行和的絕對值 為多少?input 輸入包含多組測試資料。對於每組測試資料 第...