动态规划的基本思想
设计动态规划的步骤
动态规划问题的特征
最大子段和问题描述
计算最大子段和的动态规划算法
#include<bits/stdc++.h>
#define NUM 1001
using namespace std;
int a[NUM];
int MaxSum(int n)
{
int sum=0;
int b=0;
for (int i=1; i<=n; i++)
{
if (b>0)
b+=a[i];
else
b=a[i];
if (b>sum)
sum=b;
}
return sum;
}
int main()
{
int n;
while (cin>>n)
{
for (int i=1; i<=n; i++)
cin>>a[i];
cout<< MaxSum(n);
}
return 0;
}
计算最大子段和的动态规划算法的最优解
#include <bits/stdc++.h>
#define NUM 1001
using namespace std;
int a[NUM];
int MaxSum(int n, int &besti, int &bestj)
{
int sum=0;
int b=0;
int begin = 0;
for (int i=1; i<=n; i++)
{
if (b>0)
b+=a[i];
else
{
b=a[i];
begin = i;
}
if (b>sum)
{
sum = b;
besti = begin;
bestj = i;
}
}
return sum;
}
int main()
{
int n;
int besti, bestj;
while (cin>>n && n)
{
besti = 0;
bestj = 0;
for (int i=1; i<=n; i++)
cin>>a[i];
cout<<MaxSum(n, besti, bestj)<<endl;
cout<<"从 "<<besti<<" 到 "<<bestj<<endl;
}
return 0;
}