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 }
Codeforces 981D Bookshelves 【dp】【性质】
猜你喜欢
转载自www.cnblogs.com/ZhenghangHu/p/9109800.html
今日推荐
周排行