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 }
原文:http://www.cnblogs.com/kearon/p/7215290.html