hdu_1087——dp

来源:互联网 发布:淘宝买家支付钱在哪里 编辑:程序博客网 时间:2024/06/05 07:40

这道题的大意是叫你求在一串数字中,连续上升的(可以不连续)最大子串和!!

:::::其实这个题型就是:最大连续递增子串和;

dp[i]表示第i个元素以前有满足a[i]>a[j]的最大字段和    因为子段是个递增的,所以i以前的元素一定小于a[i];

#include<iostream>
#include<string.h>
#include<stdio.h>
#include<math.h>
using namespace std;
#define mx 1009
int main()
{
    int i,j;
    int n;
    int  ans;
    int dp[mx],a[mx];
    while(scanf("%d",&n)&&n)
    {
       /************************************

       memset(dp,0,sizeof(dp));
        memset(a,0,sizeof(a));

可要可不要

/********************************
        for(i=1;i<=n;i++)
            scanf("%d",&a[i]);


        dp[1]=a[1];    ////这个很重要,因为外层循环是从2开始的


        int ans=-55;
        for(i=2;i<=n;i++)
        {


            dp[i]=a[i];////////这样做是为了保证前i个都递减的时候的情况



            for(j=1;j<i;j++)
            {
                if(a[i]>a[j])
                {
                    if(dp[i]<dp[j]+a[i])
                    {
                       dp[i]=dp[j]+a[i];
                    }
                }
            }
        ans=max(dp[i],ans);
        }
        printf("%d\n",ans);
    }
}

0 0