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 }

 

posted @ 2017-07-20 22:59  Kearon  阅读(541)  评论(0编辑  收藏  举报