J.X and Beasts
题意:X想要升级他的武器,在一条有n个商店的街上,商店有ai能量,若(2^k)|ai,那么他的武器就升级k级。
问在保证拜访商店ai递增的情况下,他的武器最大能升到几级?
思路:每个商店能升的级数记为ei,ai与其对应。dp[i]表示到i商店时的最优解。dp[i]的答案由0-i-1商店的dp[j]决定。所以有dp[i]=max(dp[i],dp[j]+e[i]);
<span style="color:#000000;">#include<bits/stdc++.h>
using namespace std;
int cal(int a){
int ans=0;
while(a%2==0){
a/=2;ans++;
}
return ans;
}
int main(){
int t,n;
scanf("%d",&t);
while(t--){
int a[105],e[105],dp[105];
memset(dp,0,sizeof(dp));
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
dp[i]=e[i]=cal(a[i]);
}
// dp[0]=e[0];
// 12 8
// 3
for(int i=0;i<n;i++){
for(int j=0;j<i;j++)
if(a[j]<a[i])
dp[i]=max(dp[i],dp[j]+e[i]);
}
int ans=0;
for(int i=0;i<n;i++)
ans=max(ans,dp[i]);
printf("%d\n",ans);
}
}</span>