题意
输入一个数n,后面跟n个数。选择里面的递增的一些数,使其和最大。
分析
dp[i]选择第i个时和最大。很显然要求dp[i]的话必须知道前面最大的那个dp[k],但是有个限制条件就是要递增,也就是说a[k]< a[i],因此遍历一遍前i-1个数,在满足递增条件的数中找到那个最大的dp[k]。状态转移方程 dp[i]=max(dp[k]+a[i])
这里之前遇到过一个小问题,就是忘记初始化dp数组为a[i]了,因为如果i前面没有满足条件的a[k]的话,那由转移代码可以看出dp[i]是不会被赋值的,但实际上是直接跳到第i个数,那也就是a[i],因此需要提前给这个dp复制a的值
代码
#include <iostream>
using namespace std;
int max(int a,int b)
{
return a>b?a:b;
}
int main()
{
int n;
while (cin>>n&&n)
{
int dp[1005]={0},number[1005];
for (int i=0;i<n;i++)
cin>>number[i];
dp[0]=number[0];
//dp数组构建
for (int i=1;i<n;i++)
{
//先给dp赋值
dp[i]=number[i];
for (int j=0;j<i;j++)
{
if (number[j]<number[i])
dp[i]=max(dp[i],dp[j]+number[i]);//状态转移
}
}
//找到dp中的最大值
int maxn=dp[0];
for (int i=0;i<n;i++)
maxn=max(maxn,dp[i]);
cout<<maxn<<endl;
}
return 0;
}