1、简单描述
给出一个序列,求该序列最大上升子序列的和。
注意:最长上升子序列的和不一定是最大上升子序列的和。
2、思路
#include<bits/stdc++.h>
using namespace std;
int arr[1001];
int Max[1001];
void Maxsum(int k)
{
memset(Max,0,sizeof(Max));
for(int i=1;i<=k;i++)
{
Max[i]=arr[i];
for(int j=1;j<i;j++)
{
if(arr[i]>arr[j])
{
if(Max[i]<Max[j]+arr[i])
{
Max[i]=Max[j]+arr[i];
}
}
}
}
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>arr[i];
Maxsum(n);
int Maxvalue=0;
for(int i=1;i<=n;i++)
{
if(Maxvalue<Max[i])
Maxvalue=Max[i];
}
cout<<Maxvalue<<endl;
return 0;
}
动态规划
1、缩小问题 以序列第i个元素为末尾元素的最大子序列和。
2、定义状态,和的结果仅与i有关,设立一个n维数组Max【i】。
3、找状态转移方程。
4、比较求解。