题解没有类似做法qw,调不出来了,样例没过,oi萌新
查看原帖
题解没有类似做法qw,调不出来了,样例没过,oi萌新
450743
XOOR楼主2024/5/10 19:04

这个做法对吗?萌新求调

dp0/1,Sdp_{0/1,S} cnt1=m,cnt0=ncnt_1=m,cnt_0=n 如果当前状态第 ii 位为 00 , i+1i+1 位为 11 ,可以向第 ii 位为 11 , i+1i+1 位为 00 的状态转移

时间复杂度是 O((n+m)2m+n)O((n+m)2^{m+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;
}
2024/5/10 19:04
加载中...