USACO 3.4 Raucous Rockers(DP)

凭着感觉写的,维数有点多,脑子就有点乱。。状态转移,还是挺好想的,开个标记数组记录j-1的最大唱片数。

 1 /*
 2       ID: cuizhe
 3       LANG: C++
 4       TASK: rockers
 5 */
 6 #include <cstdio>
 7 #include <cstring>
 8 #include <iostream>
 9 #include <cmath>
10 using namespace std;
11 int dp[21][21],o[21];
12 int p[21];
13 int main()
14 {
15     int i,j,k,n,t,m,maxz;
16     freopen("rockers.in","r",stdin);
17     freopen("rockers.out","w",stdout);
18     scanf("%d%d%d",&n,&t,&m);
19     for(i = 1; i <= n; i ++)
20         scanf("%d",&p[i]);
21     maxz = 0;
22     for(i = 1; i <= n; i ++)
23     {
24         for(j = 1; j <= m; j ++)
25         {
26             for(k = t; k >= p[i]; k --)
27             {
28                 dp[j][k] = max(o[j-1]+1,dp[j][k]);
29                 dp[j][k] = max(dp[j][k],dp[j][k-p[i]]+1);
30             }
31         }
32         for(j = 1; j <= m; j ++)
33         {
34             for(k = 1; k <= t; k ++)
35                 o[j] = max(o[j],dp[j][k]);
36         }
37     }
38     for(j = 1; j <= m; j ++)
39     {
40         for(k = 1; k <= t; k ++)
41         {
42             maxz = max(maxz,dp[j][k]);
43         }
44     }
45     printf("%d\n",maxz);
46     return 0;
47 }

 

转载于:https://www.cnblogs.com/naix-x/archive/2013/02/16/2913691.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值