bzoj1578Stock Market(dp)

来源:互联网 发布:淘宝店一个钻多少信誉 编辑:程序博客网 时间:2024/05/18 00:08

每天能获得的最大钱数只与前一天有关。对于手里每只股票,前一天可以买或不买。那么每一天的收益就取决于前一天有多少钱,怎么买。我们就可以背包了,体积为前一天有的钱数,体积为该股票前一天的价值,利润为今天的价值。

设best[ i ]为第i天的最大钱数。

#include<stdio.h>typedef long long ll;#include<algorithm>using namespace std;#define inf 500010ll d,s,sum;ll map[55][55];ll best[55];ll dp[inf];ll tmp[55];ll i,j,k;int main(){scanf("%lld %lld %lld",&s,&d,&sum);for(i=1;i<=s;i++){for(j=1;j<=d;j++){scanf("%lld",&map[j][i]);}}best[1]=sum;for(i=2;i<=d;i++){ll tot=0;for(j=1;j<=s;j++){if(map[i][j]>map[i-1][j]){tmp[++tot]=j;}}for(k=1;k<=best[i-1];k++){dp[k]=k;}for(j=1;j<=tot;j++){for(k=map[i-1][tmp[j]];k<=best[i-1];k++){dp[k]=max(dp[k],dp[k-map[i-1][tmp[j]]]+map[i][tmp[j]]);}}best[i]=max(best[i],dp[best[i-1]]);}printf("%lld",best[d]);}


0 0