hdu 1087 题解
题目概要:一串串连续的递增数列中,求最大的数列之和
分析:首先感觉和求最长递增子序列的经典题型相似,所以就考虑用动态规划来解此题。
程序说明:首先将数存在数组v[]中,dp[i]表示的是以第i个数为结尾的数列的最大和。状态转移方程是:dp[i] = max(dp[i], dp[j]+v[i]);其中dp[j]+v[i]表示的是当v[j]<v[i]时的情况。
时间复杂度是O(n2)
代码:
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
int v[1500];
int dp[1500];
int main()
{
inta, n;
while(cin >> n )
{
if( n == 0 ) break;
for( int i = 0; i < n; i ++ )
{
cin>> v[i];
}
for( int i = 0; i < n; i ++ )
{
dp[i]= v[i];
for(int j = 0; j < i; j ++ )
{
if(v[j] < v[i] )
{
dp[i]= max(dp[i], dp[j]+v[i]);
}
}
}
int max = dp[0];
for( int i = 1; i < n; i ++ )
if(max < dp[i] ) max = dp[i];
cout<<max<<endl;
}
return0;
}