题目大意:求解最大递增子序列和,这里要特别注意一点:这个题目不要求是连续的最大递增子序列。但是一定要注意是递增的!!
题目思路:dp数组表示是包含当前这个数的最大递增子序列和。dp[i]表示的是前i个并且包含第i个的最大递增子序列和!给个数据:3 1 4 显然dp[1]=3,dp[2]=1表示两个数的最大值。因为分两种情况讨论,如果第二个数大于第一个数,就加上,即dp[2]=dp[1]+num[2];如果不大,dp[2]=num[2];dp[3]=7表示三个数的最大值。首先比较num[3]和num[1],如果num[3]>num[1],dp[3]=7先存下来,如果num[3]>num[2],dp[3]=5依旧存下来;还有一种如果num[3]比前两个值都小,dp[3]=num[3];最后在存下来的dp[3]中找到一个最大的!
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int num[1010],dp[1010];
int main ()
{
int n,Max;
while (~scanf("%d",&n))
{
if (n==0)
break;
Max=0;
memset(dp,0,sizeof(dp));
for (int i=0;i<n;i++)
{
scanf("%d",&num[i]);
}
dp[0]=num[0];
for (int i=1;i<n;i++)
{
for (int j=0;j<i;j++)
{
if (num[i]>num[j])
dp[i]=max(dp[i],dp[j]+num[i]);
}
dp[i]=max(dp[i],num[i]); //这步我的理解是 8 1 2 还是不太懂 反正再和num[i]再比较下吧 num[3]比前两个值都小 这种吧
}
for (int i=0;i<n;i++)
{
Max=max(Max,dp[i]);
}
printf ("%d\n",Max);
}
return 0;
}