Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- int Set(int N,int pos){return N=N | (1<<pos);}
- int reset(int N,int pos){return N= N & ~(1<<pos);}
- bool check(int N,int pos){return (bool)(N & (1<<pos));}
- void Sos(){
- //Brute Force
- for(int mask = 0;mask < (1<<N); ++mask){
- for(int i = 0;i < (1<<N); ++i){
- if((mask&i) == i){
- F[mask] += A[i];
- }
- }
- }
- //Suboptimal Solution
- // iterate over all the masks
- for (int mask = 0; mask < (1<<n); mask++){
- F[mask] = A[0];
- // iterate over all the subsets of the mask
- for(int i = mask; i > 0; i = (i-1) & mask){
- F[mask] += A[i];
- }
- }
- //iterative version
- for(int mask = 0; mask < (1<<N); ++mask){
- dp[mask][-1] = A[mask]; //handle base case separately (leaf states)
- for(int i = 0;i < N; ++i){
- if(mask & (1<<i))
- dp[mask][i] = dp[mask][i-1] + dp[mask^(1<<i)][i-1];
- else
- dp[mask][i] = dp[mask][i-1];
- }
- F[mask] = dp[mask][N-1];
- }
- //memory optimized, super easy to code.
- for(int i = 0; i<(1<<N); ++i)
- F[i] = A[i];
- for(int i = 0;i < N; ++i) for(int mask = 0; mask < (1<<N); ++mask){
- if(mask & (1<<i))
- F[mask] += F[mask^(1<<i)];
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement