题意:找所有上升子序列和中的最大值。
思路:统计以a[i]为上升子序列的最后一个值时,向前找上一个满足的最大累加和。
写法就很多了。。
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int a[1005],dp[1005];
int main()
{
int n,ans;
while(scanf("%d",&n)&&n)
{
memset(dp,0,sizeof(dp));
ans=-1000000;
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
for(int i=0;i<n;i++)
{
for(int j=0;j<i;j++)
{
if(dp[j]==0)
dp[j]=a[j];
if(a[i]>a[j] && dp[j]+a[i]>dp[i]) //开始少了&&后面的,要汲取教训!
dp[i]=dp[j]+a[i];
}
if(dp[i]==0)
dp[i]=a[i];
if(dp[i]>ans)
ans=dp[i];
}
printf("%d\n",ans);
}
return 0;
}
之前做过这题,是另外开了个数组b,写法稍有区别,见下:
#include<cstdio>
#include<cstring>
using namespace std;
int a[1005],b[1005];
int main()
{
int ans,n;
while(scanf("%d",&n)&&n)
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
for(int i=0;i<n;i++)
{
int maxb=0;
for(int j=0;j<i;j++)
{
if(a[i]>a[j] && maxb<b[j])
maxb=b[j];
}
b[i]=a[i]+maxb;
}
ans=-1000000;
for(int i=0;i<n;i++)
{
if(b[i]>ans)
ans=b[i];
}
printf("%d\n",ans);
}
return 0;
}