状态压缩。将每一行的学生的状态看作
,
表示第
行状态为
时前
行的最大学生数量。
状态转移方程:。
。
class Solution {
public:
int maxStudents(vector<vector<char>>& a) {
int m=a.size(),n=a[0].size();
int dp[10][1<<9]={0},ans=0;
for(int j=0;j<(1<<n);j++)if(ok(a,0,j))dp[0][j]=__builtin_popcount(j);
for(int i=1;i<m;i++){
for(int j=0;j<(1<<n);j++){
if(ok(a,i,j)){
for(int k=0;k<(1<<n);k++){
if(!(j<<1&k)&&!(j>>1&k))//判断状态j的学生是否可以看到状态k的学生
dp[i][j]=max(dp[i][j],dp[i-1][k]+__builtin_popcount(j));
}
}
ans=max(ans,dp[i][j]);
}
}
return ans;
}
bool ok(vector<vector<char>>& a,int p,int j){//判断是否合法状态
int n=a[0].size();
for(int i=1;i<n;i++){
if((j>>i&1)&&(j>>(i-1)&1))return 0;
}
for(int i=0;i<n;i++){
if(j>>i&1){
if(a[p][i]=='#')return 0;
}
}
return 1;
}
};
京公网安备 11010502036488号