zoukankan      html  css  js  c++  java
  • 洛谷P1108 低价购买[DP | LIS方案数]

    题目描述

    “低价购买”这条建议是在奶牛股票市场取得成功的一半规则。要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买;再低价购买”。每次你购买一支股票,你必须用低于你上次购买它的价格购买它。买的次数越多越好!你的目标是在遵循以上建议的前提下,求你最多能购买股票的次数。你将被给出一段时间内一支股票每天的出售价(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

    题意:去重LDS方案数


    c[i]以a[i]结尾的LIS方案数
    对于i,统计c[i]的时候遇到a[j]==a[i]&&d[j]==d[i]的j前面一块就不能统计了,否则重复
    注意对于d[i]==1边界c[i]不一定为1,因为重复可能为0
    //
    //  main.cpp
    //  洛谷1108
    //
    //  Created by Candy on 08/11/2016.
    //  Copyright © 2016 Candy. All rights reserved.
    //
    
    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    #include <set>
    using namespace std;
    const int N=5005;
    inline int read(){
        char c=getchar();int x=0,f=1;
        while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
        while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
        return x*f;
    }
    int n,a[N],ans,cnt;
    int d[N],c[N];
    void dp(){
        for(int i=1;i<=n;i++){
            for(int j=1;j<i;j++) if(a[j]>a[i]) d[i]=max(d[i],d[j]);
            d[i]++;
            ans=max(ans,d[i]);
            
            if(d[i]==1) c[i]=1;
            for(int j=1;j<i;j++){
                if(a[j]==a[i]&&d[j]==d[i]) c[i]=0;
                if(a[j]>a[i]&&d[i]==d[j]+1) c[i]+=c[j];
            }
        }
        for(int i=1;i<=n;i++) if(d[i]==ans) cnt+=c[i];
    }
    int main(){
        n=read();
        for(int i=1;i<=n;i++) a[i]=read();
        dp();
        printf("%d %d
    ",ans,cnt);
        return 0;
    }
  • 相关阅读:
    【HDOJ】2774 Shuffle
    【POJ】2170 Lattice Animals
    【POJ】1084 Square Destroyer
    【POJ】3523 The Morning after Halloween
    【POJ】3134 Power Calculus
    【Latex】如何在Latex中插入伪代码 —— clrscode3e
    【HDOJ】4801 Pocket Cube 的几种解法和优化
    【HDOJ】4080 Stammering Aliens
    【HDOJ】1800 Flying to the Mars
    SQL语法
  • 原文地址:https://www.cnblogs.com/candy99/p/6045325.html
Copyright © 2011-2022 走看看