• 刷题向》DP》关于基础DP(easy)


    openjudge  8464

    这道题其实很简单,算是DP的基础题,比较适合开拓DP思维。

    题目比较有欺骗性,其实稍微想想就可以解决,因为题意说第一次卖出后才能买入,所以我们可以考虑枚举断点,所以题目一下变得简单,我们线性扫两遍,算最大值就好了。

    具体为:

    由于不能同时进行两次交易,所以枚举断点,一遍扫做1到n的前n个的最大值,由于最大值一定是单调递增的,所以每次读入新的a[i],判断是否有更优解就好了,同理,一遍扫n到1的后n个的最大值,做同样的事,然后枚举断点取最大值。

    代码如下:

     1 #include<stdio.h>
     2 int T,n,a[100100],f[100100],g[100100],ans;
     3 int main()
     4 {
     5     scanf("%d",&T);
     6     while(T--)
     7     {
     8         int best=-2147483647,temp=2147483647;
     9         scanf("%d",&n);
    10         for(int i=1;i<=n;i++)
    11             scanf("%d",&a[i]);
    12         for(int i=1;i<=n;i++)
    13         {
    14             if(a[i]<temp)
    15                 temp=a[i];
    16             if(a[i]-temp>best)
    17                 best=a[i]-temp;
    18             f[i]=best;
    19         }
    20         best=-2147483647,temp=-2147483647;
    21         for(int i=n;i>=1;i--)
    22         {
    23             if(a[i]>temp)
    24                 temp=a[i];
    25             if(temp-a[i]>best)
    26             best=temp-a[i];
    27             g[i]=best;
    28         }
    29         for(int i=1;i<=n;i++)
    30             if(f[i]+g[i]>ans)ans=f[i]+g[i];
    31         printf("%d
    ",ans);
    32         ans=0;
    33     }
    34     return 0;
    35 }
    View Code
  • 相关阅读:
    关于java集合框架(二):List
    仪式感
    java的foreach(增强for循环)
    关于Java集合框架(一):概述与Set
    重新开始
    简单fork循环分析
    fork,写时复制(copy-on-write),vfork
    树莓派换源
    Windows下TexLive2018环境配置及检测
    Linux下高精度时间
  • 原文地址:https://www.cnblogs.com/PencilWang/p/5037267.html
Copyright © 2020-2023  润新知