zoukankan      html  css  js  c++  java
  • LC 1349. Maximum Students Taking Exam

    Link

    Solution 0:

    class Solution {
    public:
        int m,n;
        int maxStudents(vector<vector<char>>& seats) {
            m=seats.size();
            n=seats[0].size();
            vector<vector<int>> dp(m*n+2,vector<int>(1<<(2*n),-1));
            return dfs(seats,0,0,dp);
        }
        
        int dfs(vector<vector<char>>& seats, int pos, int state, vector<vector<int>> &dp){
            if(dp[pos][state]!=-1) return dp[pos][state];
            if(pos==m*n) return 0;
            int x=pos/n;
            int y=pos%n;
            if(y==0){
                state=state>>n;
            }
            int take=0,untake=0;
            untake=dfs(seats,pos+1,state,dp);
            int flag=0;
            if(seats[x][y]=='#') flag=1;
            if(y-1>=0 && (state&(1<<(y-1+n)))>0) flag=1;
            if(y+1<n && (state&(1<<(y+1+n)))>0) flag=1;
            if(y-1>=0 && x>0 && (state&(1<<(y-1)))>0) flag=1;
            if(y+1<n && x>0 && (state&(1<<(y+1)))>0) flag=1;
            if(flag==0) take=1+dfs(seats,pos+1,state|(1<<(y+n)),dp);
            return dp[pos][state]=max(take,untake);
        }
    };

     Solution 1 :

    class Solution {
    public:
        int m,n;
        int maxStudents(vector<vector<char>>& seats) {
            m=seats.size();
            n=seats[0].size();
            vector<vector<int>> dp(m+1,vector<int>(1<<(2*n),-1));
            return dfs(seats,0,0,dp);
        }
        
        int dfs(vector<vector<char>>& seats, int row, int state, vector<vector<int>> &dp){
            if(row==m) return 0;
            if(dp[row][state]!=-1) return dp[row][state];
            int ns=state>>n;  // when we want to skip to next row, need to change the state
            int tmp1= dfs(seats,row+1,ns,dp); 
            int tmp2=0;
            for(int i=0;i<n;++i){    // check whether we can fill seats[row][i]
                if(seats[row][i]=='#') continue;
                if((state&(1<<(n+i)))>0) continue;
                if(i-1>=0 && (state&(1<<(n+i-1)))>0) continue; // left
                if(i+1<n && (state&(1<<(n+i+1)))>0) continue;  // right
                if(row>0 && i-1>=0 && (state&(1<<(i-1)))>0) continue; //topleft
                if(row>0 && i+1<n && (state&(1<<(i+1)))>0) continue; //topright
                tmp2=max(tmp2,1+dfs(seats,row,state|(1<<i+n),dp));
            }
            return dp[row][state]=max(tmp1,tmp2);
            
        }
    };

    Solution 2:

    class Solution {
    public:
        int m,n;
        
        int maxStudents(vector<vector<char>>& seats) {
            m=seats.size();
            n=seats[0].size();
            vector<vector<int>> dp(m+1,vector<int>(1<<n,-1));
            return dfs(seats,0,0,dp);
        }
        
        int dfs(vector<vector<char>>& seats, int row, int prestate, vector<vector<int>> &dp){
            if(row==m) return 0;
            if(dp[row][prestate]!=-1) return dp[row][prestate];
            
            vector<int> curstates;
            dfs1(seats[row],0,prestate,curstates,0);
            int res=0;
            for(int sta:curstates){
                int cnt=getcnt(sta);
                res=max(res,cnt+dfs(seats,row+1,sta,dp));
            }
            return dp[row][prestate]=res;
        }
        
        int getcnt(int sta){
            int res=0;
            for(int i=0;i<n;++i){
                if((sta&(1<<i))>0) res++;
            }
            return res;
        }
        
        void dfs1(vector<char> seat, int col, int prestate, vector<int>& curstates, int curstate){
            if(col==n) {
                curstates.push_back(curstate);
                return;
            }
            dfs1(seat,col+1,prestate,curstates,curstate);
            
            int flag=0;
            if(seat[col]=='#') return;
            if(col-1>=0 && (((1<<(col-1))&curstate)>0 || ((1<<(col-1))&prestate)>0)) return;
            if(col+1<n && ((1<<(col+1))&prestate)>0) return;
            dfs1(seat,col+1,prestate,curstates,curstate|(1<<col));
        }
    };
  • 相关阅读:
    【郑轻】[1749]Forceast!
    【郑轻】[1749]Forceast!
    【郑轻】[1754]Chowhound!Chowhound!!Chowhound!!!
    【郑轻】[1754]Chowhound!Chowhound!!Chowhound!!!
    【郑轻】[1750]Bean!
    【郑轻】[1750]Bean!
    【郑轻】[1000]整数A+B
    【郑轻】[1000]整数A+B
    【杭电】[1236]排名
    【杭电】[1236]排名
  • 原文地址:https://www.cnblogs.com/FEIIEF/p/12287265.html
Copyright © 2011-2022 走看看