题目传送门
解题思路:
一道DP,完全背包,不过有点不同于模板.因为本题的每件物品可自由在不同的时间买卖,且不同时间价格不同.
这道题的关键在于要明白一个非常傻逼的性质,就是我在某天买了第i个物品,然后又把它卖出去,其实我啥也没干.
所以,我想将一个物品在第i天买,在第i+n天卖出去,其实可以转化为在第i天买,第i+1,i+2......i+n-1天都当天卖出去然后当天再买回来,第i+n天卖出去.
最后,套完全背包即可.
AC代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 5 using namespace std; 6 7 long long t,n,m,a[2001][2001],f[20001],ans; 8 9 int main() { 10 scanf("%lld%lld%lld",&t,&n,&m); 11 for(int i = 1;i <= t; i++) 12 for(int j = 1;j <= n; j++) 13 scanf("%lld",&a[i][j]); 14 for(int i = 1;i <= t; i++){ 15 memset(f,0,sizeof(f)); 16 for(int j = 1;j <= n; j++) 17 for(int x = a[i][j];x <= m; x++) 18 f[x] = max(f[x],f[x-a[i][j]] + a[i+1][j] - a[i][j]); 19 m = max(m,f[m] + m); 20 } 21 printf("%lld",m); 22 return 0; 23 }
//CSP-J 2019 T3