Codeforces 981D Bookshelves 【dp】【性质】

 1 #include<iostream>
 2 #include<cstring>
 3 using namespace std;
 4 
 5 long long sum[55],ans;
 6 int dp[55][55];//前i个书放进k个书架里&起来能不能等于check里的x
 7 
 8 bool check(int i,int j,long long x){
 9     if(dp[i][j]!=-1) return dp[i][j];
10     if(j==1){
11         if( (sum[i]&x) ==x) return dp[i][j]=1;
12         return dp[i][j]=0;
13     }
14     for(int k=j-1;k<i;k++){
15         if( check(k,j-1,x) && ((sum[i]-sum[k])&x)==x ) return dp[i][j]=1;
16     }
17     return dp[i][j]=0;
18 } 
19 
20 int main(){
21     int n,k; cin>>n>>k;
22     for(int i=1;i<=n;i++) { cin>>sum[i]; sum[i]+=sum[i-1]; }
23     
24     for(int i=60;i>=0;i--){//枚举ans在二进制下的每一位
25         memset(dp,-1,sizeof(dp));
26         long long a=1; a=a<<i;
27         if( check(n,k,ans+a) ) ans+=a;
28     }
29     cout<<ans<<endl;
30     
31     return 0;
32 }

猜你喜欢

转载自www.cnblogs.com/ZhenghangHu/p/9109800.html