求最大连续子序列和,以下列出两种方法
方法1:full search,
双重循环,找出所有的sij组合(i<j,sij表示从i到j子序列的和)
方法2:dynamic planning
动态规划的思路:di 表示以 i 结束的子序列的和,则动态规划策略可以表示为:
di = d[i-1] + ai; d[i-1]>0;
di = ai; d[i-1]<0;
int main()
{
using namespace std;
int n;
cin >> n;
int* a = new int[n];
for (int i = 0; i < n; i++) {
cin >> a[i];
}
//method 1 O(n^2)
//intput : 8
// 4, -3, 5, -2, -1, 2, 6, -2
int max = 0;
int maxi = 0, maxj = 0;
int sum = 0;
for (int i = 0; i < n; i++)
{
sum = a[i];
if (sum > max)
{
max = sum;
maxi = maxj = i;
}
for (int j = i + 1; j < n; j++)
{
sum += a[j];
if (sum > max)
{
max = sum;
maxi = i;
maxj = j;
}
}
}
cout << "full search :" << endl;
cout << "max:" << max << ' ' << "maxi:" << maxi << ' ' << "maxj:" << maxj << endl;;
//method2 dynamic planning (dp)
cout << "dp:" << endl;
//di present max sum which include ai
int* d = new int[n]; // si 表示 a0 到 ai(包含ai)最大和
int* di = new int[n];// di save the start index;
d[0] = a[0];
di[0] = 0;
int dmax=0,index=0;
for (int i = 1; i < n; i++)
{
if (d[i - 1] > 0)
{
d[i] = d[i - 1] + a[i];
di[i] = di[i - 1];
}
else
{
d[i] = a[i];
di[i] = i;
}
}
for (int i = 0; i < n; i++)
{
if (d[i] > dmax)
{
dmax = d[i];
index = i;
}
cout << d[i] << ' ';
}
cout << "dmax" << dmax << ' ' << "di:" << di[index] << ' ' << "dj:" << index << endl;
return 0;
}