每天能獲得的最大錢數只與前一天有關。對於手裏每隻股票,前一天可以買或不買。那麼每一天的收益就取決於前一天有多少錢,怎麼買。我們就可以揹包了,體積爲前一天有的錢數,體積爲該股票前一天的價值,利潤爲今天的價值。
設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]);
}