洛谷 P5662 纪念品

题目传送门

解题思路:

一道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

posted @ 2019-11-24 00:28  Mr^Simon  阅读(252)  评论(0编辑  收藏  举报