• P2938 [USACO09FEB]股票市场Stock Market


    题目描述

    尽管奶牛天生谨慎,它们仍然在住房抵押信贷市场中大受打击,现在它们准备在股市上碰碰运气。贝西有内部消息,她知道 SS 只股票在今后 DD 天内的价格。

    假设在一开始,她筹集了 MM 元钱,那么她该怎样操作才能赚到最多的钱呢?贝西在每天可以买卖多只股票,也可以多次买卖同一只股票,交易单位必须是整数,数量不限。举一个牛市的例子:

    假设贝西有 10 元本金,股票价格如下:

    股票今天的价格明天的价格后天的价格
    AA 10 15 15
    BB 13 11 20

    最赚钱的做法是:今天买入 AA 股 1 张,到明天把它卖掉并且买入 B 股 1 张,在后天卖掉 B股,这样贝西就有 24 元了。

    输入格式

    第一行:三个整数 S, D 和 M,2 ≤ S ≤ 50 ; 2 ≤ D ≤ 10 ; 1 ≤ M ≤ 2000001

    第二行到第 S + 1 行:第 i + 1 行有 D 个整数: P_{i;1}Pi;1 到 P_{i;D},表示第 ii 种股票在第一天到最后一天的售价,对所有1 ≤ j ≤ D1jD,1 ≤ Pi1Pi;j ≤ 1000j1000

    输出格式

    单个整数:表示奶牛可以获得的最大钱数,保证这个数不会超过 500000

    解析:我们可以发现每一天同一个股票,买入价与售出价相等。这代表我可以看做在一天中,我先不管三七二十一把所有股票都售出,然后再选能赚钱的再买,也就变成了一个s遍的完全背包。代码如下:

    #include<bits/stdc++.h>
    using namespace std;
    int a[51][51];
    int dp[500001];
    int w[51],v[51];
    int main()
    {
        int n,m,money;
        scanf("%d%d%d",&n,&m,&money);
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                scanf("%d",&a[j][i]);
            }
        }
        for(int i=1;i<=m-1;i++)
        {
            for(int j=1;j<=n;j++)
            {
                w[j]=a[i][j];
                v[j]=a[i+1][j];
            }
            for(int j=0;j<=money;j++) dp[j]=j;
            for(int k=1;k<=n;k++)
            {
                for(int j=w[k];j<=money;j++)
                {
                    dp[j]=max(dp[j],dp[j-w[k]]+v[k]);
                }
            }
            money=dp[money];
        }
        cout<<money;
        return 0;
    }
  • 相关阅读:
    hdu 1042 N!
    hdu 1002 A + B Problem II
    c++大数模板
    hdu 1004 Let the Balloon Rise
    hdu 4027 Can you answer these queries?
    poj 2823 Sliding Window
    hdu 3074 Multiply game
    hdu 1394 Minimum Inversion Number
    hdu 5199 Gunner
    九度oj 1521 二叉树的镜像
  • 原文地址:https://www.cnblogs.com/chen-1/p/11067197.html
Copyright © 2020-2023  润新知