要求:求一个序列的最大上升子序列和。
方法:dp裸题。
1.最大上升子序列和比最大子序列和多了一个判定条件。
2.时间复杂度为O(n^2)。
3.dp[i]为以下标为i的数结尾的序列的最大上升子序列和。
4.状态转移方程:dp[i]=max(dp[i],dp[j]+a[i]) (j<i且a[j]<a[i])。
5.这道题暴力dp,数据弱所以O(n^2)就过了。
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define inf 0x3f3f3f3f
int main()
{
int i,j,k,n;
int a[1005],dp[1005];
while(scanf("%d",&n)&&n!=0)
{
for(i=0;i<n;i++)
scanf("%d",&a[i]);
int max1=-1;
for(i=0;i<n;i++)
{
dp[i]=a[i];
for(j=0;j<i;j++)
{
if(a[j]<a[i])
{
dp[i]=max(dp[i],dp[j]+a[i]);
}
}
max1=max(max1,dp[i]);
}
printf("%d\n",max1);
}
}