直接做掉的状态压缩dp,但是数组开小了,WA了3次。。。。
#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<algorithm>
using namespace std;
int um[1001],state[10001],num;
void getdp(int n)
{
num = 0;
for(int i=0;i<(1<<n);i++)
if((i&(i<<2) )== 0)
state[num++] = i;
}
int make_dp(int x){
int sum = 0;
while(x){
if(x % 2 == 1)sum++;
x /= 2;
}
return sum;
}
int dp[108][230][230];
int main() {
int n,m,t;
// freopen("input.txt","r",stdin);
while(~scanf("%d%d",&n,&m)){
memset(um,0,sizeof(um));
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
scanf("%d",&t);
if(t == 0) um[i] = um[i]|(1<<j);
}
}
getdp(m);
memset(dp,-1,sizeof(dp));
for(int i=0;i<num;i++) {
if(um[0] & state[i])continue;
dp[0][i][0] = make_dp(state[i]);
}
for(int i=1;i<n;i++)
{
for(int j = 0;j<num;j++){
if(um[i] & state[j])continue;
for(int k=0;k<num;k++){
if(state[j]&(state[k]<<1))continue;
if((state[j]<<1)&(state[k]))continue;
for(int p=0;p<num;p++)
{
if(dp[i-1][k][p] == -1) continue;
if((state[k]<<1) & state[p])continue;
if(state[j]&(state[p]))continue;
if((state[k]&(state[p]<<1)))continue;
dp[i][j][k] = max(dp[i][j][k],dp[i-1][k][p]+make_dp(state[j]));
}
}
}
}
int ans = -1;
for(int i=0;i<num;i++)
for(int j=0;j<num;j++)
ans = max(ans,dp[n-1][i][j]);
printf("%d\n",ans);
}
}