BZOJ-1578: [Usaco2009 Feb]Stock Market 股票市场

[文章目录]

Description

尽管奶牛们天生谨慎,她们仍然在住房抵押信贷市场中受到打击,现在她们开始着手于股市。 Bessie很有先见之明,她不仅知道今天S (2 <= S <= 50)只股票的价格,还知道接下来一共D(2 <= D <= 10)天的(包括今天)。 给定一个D天的股票价格矩阵(1 <= 价格 <= 1000)以及初始资金M(1 <= M <= 200,000),求一个最优买卖策略使得最大化总获利。每次必须购买股票价格的整数倍,同时你不需要花光所有的钱(甚至可以不花)。这里约定你的获利不可能超过500,000。

一开始想到每两天的股票差价跑一遍背包。实际上第i天买入,第j天卖出相当于i天买入,i+1天卖出,i+1天再买入。。。
所以相邻2天跑一遍背包就好了。将i天的价格当做体积,i+1天的价格当做价值,不买的话就当做一个体积价格都为1的物品就好了。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int s,d,map[20][60];
int f[701000],dp[20];
int main()
{
    scanf("%d%d%d",&s,&d,&dp[1]);
    for(int i=1;i<=s;++i)
        for(int j=1;j<=d;++j)
            scanf("%d",&map[j][i]);
    for(int i=2;i<=d;++i)
    {
        memset(f,-0x3f,sizeof(int)*(dp[i-1]+10)); f[0]=0;
        for(int j=1;j<=s;++j)
        {
            for(int k=map[i-1][j];k<=dp[i-1];++k)
                f[k]=max(f[k],f[k-map[i-1][j]]+map[i][j]);
        }
        for(int k=1;k<=dp[i-1];++k)
            f[k]=max(f[k],f[k-1]+1);
        dp[i]=f[dp[i-1]];
    }
    printf("%d",dp[d]);
    return 0;
}

发表评论

邮箱地址不会被公开。 必填项已用*标注