hdu1087 dp

我思维比较差,平时也不敢碰dp,但是没办法必须学。这题虽然做了很久,修修改改很久,但是最后做出了,还是很好地。

对于如果a[j]>a[i],并且j>i,那么i能跳到j,那dp[j]=max(dp[i]+a[j],dp[j]);如果不能跳转dp[j]=max(dp[j],a[j]);保证dp[j]最大。

#include<stdio.h>
#include<string.h>
#define maxn 1100
int max(int x,int y)
{
    return x>y?x:y;
}
int main()
{
    int i,j,n,dp[maxn],a[maxn];
    while(scanf("%d",&n)!=EOF)
    {
        if(!n)break;
        for(i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
            dp[i]=a[i];
        }
        dp[0]=0;
        for(i=1;i<=n;i++)
            for(j=1;j<=n;j++)
            {
                if(a[i]<a[j]&&j>i)//从i跳到j
                {
                    dp[j]=max(dp[i]+a[j],dp[j]);
                }
                else 
                    dp[j]=max(dp[j],a[j]);//不能跳转 选取最大的。
            }
        int ans=-999999;
        for(i=1;i<=n;i++)
            if(dp[i]>ans)
                ans=dp[i];
        printf("%d\n",ans);
    }
}

 

posted @ 2015-08-20 16:27  sweat123  阅读(150)  评论(0)    收藏  举报