zoukankan      html  css  js  c++  java
  • HDU 1087 Super Jumping! Jumping! Jumping!(最长上升子序列,dp)

    该题可以算是一道经典的DP题了,题中数据是这样的。以 3 1 3 2 为例,首先 3 代表有三个数, 后面给出三个数,求该串的一个子串,使得其值一直是递增的,而且要求输出最大的和值。可以论证,该子串一定会是最长上升子串,因为,如果一个串还能够插入一个元素的话,那么这个串就一定不是最大的和了。而这个最长的上升子串还满足是所有同样长度的子串中最优的,和值最大。
      具体实现过程这样来,首先记录下N个数  rec[] 数组,对于每个数开辟一个 dp[] 数组,用来记录到达该数值时的最大和值,dp[]数组很重要,因为它能够对解决后面的问题提供信息,记录局部的最有解。 动态规划方程是  dp[i] = Max( dp[i] , dp[j] + rec[i] ) , 这个方程的前提是,j < i  &&  rec[j] < rec[i], 因为题目要求是从前往后跳,且只能跳到较大的数字上面去。最后再遍历一次,找到最大的值即可。
    o(n^2)复杂度
    #include<stdio.h>
    #include<string.h>
    int main()
    {
        int n,a[1010],i,j,dp[1010],maxx;
        while(scanf("%d",&n),n)
        {
            maxx=-2100000000;
            for(i=0;i<n;i++)
            {
                scanf("%d",&a[i]);
                dp[i]=a[i];
                for(j=0;j<i;j++)
                {
                    if(a[j]<a[i])
                    dp[i]=dp[i]>(dp[j]+a[i])? dp[i]:(dp[j]+a[i]);
                }
            }
            for(i=0;i<n;i++)
            {
                maxx=maxx>dp[i]? maxx:dp[i];
            }
            printf("%d
    ",maxx);
        }
        return 0;
    }
    View Code
    一道又一道,好高兴!
  • 相关阅读:
    第五次博客作业
    第三次博客作业
    个人简介
    实验三
    实验二
    实验一
    《构建之法》心得体会
    第三次博客园作业
    软件测试实验二
    个人简历
  • 原文地址:https://www.cnblogs.com/laiba2004/p/3251827.html
Copyright © 2011-2022 走看看