J - X and Beasts

 1 /*
 2 n个商店,每个商店的数值是ai,能提升的能力值为ai的二进制形式的结尾0的个数
 3 购买序列的ai必须升序,问顺序访问商店最大提升能力值为多少
 4 动态规划,定义dp[n]为以购买第n个商店的升级为结尾的购买方案的提升最大值
 5 所以dp[0]=0;
 6 dp[i]=max(dp[i],dp[j]+k[i]);
 7 */
 8 #include <bits/stdc++.h>
 9 using namespace std;
10 int pow2[32];
11 int dp[110];
12 void init()
13 {
14     pow2[0]=1;
15     for(int i=1;i<20;i++)
16         pow2[i]=pow2[i-1]*2;
17 }
18 int main()
19 {
20     int n;
21     init();
22     scanf("%d",&n);
23     while(n--)
24     {
25         memset(dp,0,sizeof(dp));
26         int m,t[110],k[110];
27         scanf("%d",&m);
28         for(int i=0;i<m;i++)
29         {
30             scanf("%d",&t[i]);
31 
32             for(int j=17;j>=0;j--)
33                 if(t[i]%pow2[j]==0)
34                 {
35                     k[i]=j;
36                     dp[i]=j;
37                     break;
38                 }
39         }
40         for(int i=1;i<m;i++)
41         {
42             for(int j=0;j<i;j++)
43                 if(t[i]>t[j])
44                 dp[i]=max(dp[i],dp[j]+k[i]);
45         }
46         int ans=0;
47         for(int i=0;i<m;i++)
48             if(ans<dp[i]) ans=dp[i];
49         printf("%d\n",ans);
50     }
51 }

 

转载于:https://www.cnblogs.com/kearon/p/7215290.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值