每天能获得的最大钱数只与前一天有关。对于手里每只股票,前一天可以买或不买。那么每一天的收益就取决于前一天有多少钱,怎么买。我们就可以背包了,体积为前一天有的钱数,体积为该股票前一天的价值,利润为今天的价值。
设best[ i ]为第i天的最大钱数。
#include<stdio.h>
typedef long long ll;
#include<algorithm>
using namespace std;
#define inf 500010
ll 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]);
}