这是一个典型的动态规划问题。由于是动态规划新手,起初的时候没有划分好子问题,导致有的测试结果一直wa.
对于数据a[1...n],可以分为n个子问题,我们思考最后一步经过哪里?于是又n中可能,最后一步可能经过a1.a2...an,用m[i]表示最后一步经过a[i]可以获得的最大的值,那么m[i]怎么表示?我们可以考虑倒数第二步,于是有递推公式:m[i]=max{a[i]+m[k]}(其中a[i]>a[k],0<k<i),于是求解最大序列可以表示为:
sum=max{m[k]}(其中0<k<=i)
对于这个递归方程解释为:先求解最后一次经过a[i]的m[i],然后搜索m[1...i]的最大值即为sum的值
#include<iostream>
#include<cmath>
using namespace std;
_int64 MaxJump(_int64 a[], int n);
int main(){
int i, n;
_int64 a[1001];
while (cin >> n&&n){
for (i =1; i<=n; i++)
cin >> a[i];
cout << MaxJump(a, n) << endl;
}
return 0;
}
_int64 MaxJump(_int64 a[], int n){
_int64 i,j,max=a[1];
_int64 m[1001];
m[0] = 0, m[1] = a[1];
for (i = 2; i <= n; i++){
/*先解决m[i]*/
m[i] =a[i];
for (j = 1; j < i; j++){
if (a[i]>a[j] && m[i] < m[j] + a[i])
m[i] = m[j] + a[i];
}
}
for (i = 1; i <= n;i++)
if (max < m[i])
max = m[i]; //求解m[1...n]最大值
return max;
}