标签:
Description
Input
Output
Sample Input
3 1 3 2 4 1 2 3 4 4 3 3 2 1 0
Sample Output
4 10 3
题意:一开始对题意不是很明确,看了别人的翻译才明白题目的意思。
知识点:最大上升子序列求和。。。从前往后搜
状态转移方程:dp[i]=max(dp[i],dp[j]+a[i])
AC代码:
解法一:
#include<iostream>
#include<cstdio>
#include<cstring>
int dp[1005],a[1005];
int main ()
{
int n,i,j,max;
while(scanf("%d",&n)!=EOF&&n)
{
max=-999;
memset(a,0,sizeof(a));
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
memset(dp,0,sizeof(dp));
for(i=1;i<=n;i++)
{
dp[i]=a[i];
for(j=1;j<=i;j++)
{
if(a[j]<a[i]&&dp[i]<dp[j]+a[i])//状态转移方程:dp[i]=max(dp[i],dp[j]+a[i])
dp[i]=dp[j]+a[i];
}
if(max<dp[i])
max=dp[i];
}
printf("%d\n",max);
}
return 0;
}
解法二:
#include <iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int a[1005],d[1005];
int max(int a,int b)
{
return a>b?a:b;
}
int main()
{
int n,sum;
memset(d,0,sizeof(d));
while(~scanf("%d",&n)&&n)
{
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n;i++)
{
sum=-999;
for(int j=0;j<i;j++)
{
if(a[i]>a[j])
sum=max(d[j],sum);
}
d[i]=sum+a[i];
}
sum=-999;
for(int i=1;i<=n;i++)
{
if(sum<d[i]) sum=d[i];
}
printf("%d\n",sum);
}
return 0;
A - Super Jumping! Jumping! Jumping!
标签:
原文地址:http://www.cnblogs.com/lbyj/p/5758037.html