zoukankan      html  css  js  c++  java
  • P1108 低价购买

     P1108 低价购买

    题目描述

    “低价购买”这条建议是在奶牛股票市场取得成功的一半规则。要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买;再低价购买”。每次你购买一支股票,你必须用低于你上次购买它的价格购买它。买的次数越多越好!你的目标是在遵循以上建议的前提下,求你最多能购买股票的次数。你将被给出一段时间内一支股票每天的出售价(2^16范围内的正整数),你可以选择在哪些天购买这支股票。每次购买都必须遵循“低价购买;再低价购买”的原则。写一个程序计算最大购买次数。

    这里是某支股票的价格清单:

    日期 1 2 3 4 5 6 7 8 9 10 11 12

    价格 68 69 54 64 68 64 70 67 78 62 98 87

    最优秀的投资者可以购买最多4次股票,可行方案中的一种是:

    日期 2 5 6 10

    价格 69 68 64 62

    输入输出格式

    输入格式:

    第1行: N (1 <= N <= 5000),股票发行天数

    第2行: N个数,是每天的股票价格。

    输出格式:

    输出文件仅一行包含两个数:最大购买次数和拥有最大购买次数的方案数(<=2^31)当二种方案“看起来一样”时(就是说它们构成的价格队列一样的时候),这2种方案被认为是相同的。

    输入输出样例

    输入样例#1:
    BUYLOW.IN
    12
    68 69 54 64 68 64 70 67 78 62 98 87
    
    输出样例#1:
    BUYLOW.OUT
    4 2

    先探索一下样例,最大购买次数为4次,共有2中方案,分别是69 68 64 62、69 68 67 62。

    我们发现,这道题实际上是在一个数列中选出一个序列,使得这个序列是下降序列(即序列中的任意一个数必须大于它后面的任何一个数),且要使这个序列的长度最长。但是这道题要输出总的方案数,这就需要对原有的求解过程做一些变动。求方案总数最主要的是要剔除重复方案。当第2行N个数其中有两个以上价格相同时,可能就会产生重复方案。产生重复方案时,显然后面价格的要比前面的更优,因为以后面的价格结尾的最长下降序列的总数肯定不会比前一个少,而且其方案必定囊括了前面这个价格的所有方案。因此,在解题过程中,我们就可以只考虑相同价格中后面的那个。推广开来,如果当前状态之前存在重复的状态,我们只要考虑离当前状态位置最近的那一个即可。

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 
     5 using namespace std;
     6 const int N = 5010;
     7 int f[N],t[N],a[N];
     8 int n,ans,sum;
     9 
    10 int main()
    11 {
    12     scanf("%d",&n);
    13     for(int i=1;i<=n;++i)
    14     {
    15         scanf("%d",&a[i]);
    16         f[i] = 1;
    17     }
    18     for(int i=1;i<=n;++i)
    19     {
    20         for(int j=i-1;j;--j)
    21         {
    22             if(a[j] > a[i])
    23                 f[i] = max(f[i],f[j]+1);
    24         }
    25         if(f[i]==1) t[i] = 1;
    26         for(int j=i-1;j;--j)
    27         {
    28             if(a[j]>a[i] && f[i]-1==f[j]) t[i] += t[j];
    29             else if(a[j]==a[i] && f[i]==f[j]) t[j] = 0;
    30         }
    31         ans = max(ans,f[i]);
    32     }
    33     for(int i=1;i<=n;++i)
    34         if(f[i]==ans) sum += t[i];
    35     printf("%d %d",ans,sum);
    36     return 0;
    37 }
  • 相关阅读:
    Study Plan The Twelfth Day
    Study Plan The Fifteenth Day
    Study Plan The Seventeenth Day
    Study Plan The Tenth Day
    Study Plan The Eighth Day
    Study Plan The Eleventh Day
    Study Plan The Sixteenth Day
    Study Plan The Thirteenth Day
    Study Plan The Fourteenth Day
    Study Plan The Ninth Day
  • 原文地址:https://www.cnblogs.com/mjtcn/p/6873886.html
Copyright © 2011-2022 走看看