zoukankan      html  css  js  c++  java
  • [bzoj1578][Usaco2009 Feb]Stock Market 股票市场_完全背包dp

    Stock Market 股票市场 bzoj-1578 Usaco-2009 Feb

    题目大意:给定一个$S imes D$的大矩阵$T$,其中$T[i][j]$表示第i支股票第j天的价格。给定初始资金$M$,求最后的最大收益。

    注释:$1le Sle 50$,$1le Dle 10$,$1le Mle 2cdot 10^5$,$1le val_ile 10^4$。


    想法

    我们如果前几天买股票然后过几天卖掉等价于第一天买第二天卖掉然后持续到今天。

    也就是持续的买卖到今天。

    也就是说我们可以通过前一天的情况进行完全背包dp。

    复杂度$O(MSD)$。

    Code:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    int a[110][20]; int f[500010];
    inline char nc() {static char *p1,*p2,buf[100000]; return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;}
    int rd() {int x=0; char c=nc(); while(!isdigit(c)) c=nc(); while(isdigit(c)) x=(x<<3)+(x<<1)+(c^48),c=nc(); return x;}
    inline void Max(int &x,int y) {x=max(x,y);}
    int main()
    {
    	// freopen("1578.in","r",stdin);
    	int n=rd(),m=rd(),all=rd(); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) a[i][j]=rd();
    	for(int i=1;i<m;i++)
    	{
    		memset(f,0,sizeof f); for(int j=1;j<=n;j++)
    		{
    			for(int k=a[j][i];k<=all;k++)
    			{
    				Max(f[k],f[k-a[j][i]]+a[j][i+1]-a[j][i]);
    			}
    		}
    		all+=f[all];
    	}
    	cout << all << endl ;
    	return 0;
    }
    

    小结:好题。

  • 相关阅读:
    第一个爬虫和测试
    乒乓球比赛模拟分析
    appium入门
    node安装
    自动化测试---selenium
    自动化测试---元素定位
    Shell脚本
    Shell脚本的编写
    Linux安装jdk,mysql,tomcat
    Linux的简单使用
  • 原文地址:https://www.cnblogs.com/ShuraK/p/10098471.html
Copyright © 2011-2022 走看看