这个做法对吗?萌新求调
dp0/1,S cnt1=m,cnt0=n 如果当前状态第 i 位为 0 , i+1 位为 1 ,可以向第 i 位为 1 , i+1 位为 0 的状态转移
时间复杂度是 O((n+m)2m+n)
#include<bits/stdc++.h>
using namespace std;
const int N=11;
int n,m;
int a[N][N],b[N][N],dp[2][1<<((N<<1)-1)],bits[N<<1];
int main(){
freopen("in.in","r",stdin);
scanf("%d%d",&n,&m);
for(int S=(1<<m)-1;S<=(1<<(n+m))-(1<<n);S++) dp[0][S]=-1e9-10,dp[1][S]=1e9+10;
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%d",&a[i][j]);
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%d",&b[i][j]);
dp[1][(1<<m)-1]=0;
dp[0][(1<<m)-1]=0;
for(int S=(1<<m)-1;S<=(1<<(n+m))-(1<<n);S++){
int t=S,num=0,x=n+1,y=1;
for(int i=1;i<=n+m;i++) num+=t%2,bits[n+m-i+1]=t%2,t/=2;
if(num!=m) continue ;
for(int i=1;i<n+m;i++){
if(bits[i]) y++;
else x--;
if(!bits[i] && bits[i+1]){
int S1=S^(1<<(n+m-i))^(1<<(n+m-i-1));
dp[0][S1]=max(dp[0][S1],dp[1][S]+a[x][y]);
dp[1][S1]=min(dp[1][S1],dp[0][S]-b[x][y]);
}
}
}
// printf("%d %d\n",dp[0][11],dp[1][11]);
printf("%d",dp[((n*m)%2)^1][(1<<(n+m))-(1<<n)]);
return 0;
}