题目:一双木棋
思路:
STO ouuan&cxy
状压轮廓线,记忆化搜索。
省选咕咕现在才过……太菜了啊
代码:
#include<bits/stdc++.h>
using namespace std;
#define maxn 10
#define Sstate ((1<<n)-1)
#define Tstate (((1<<n)-1)<<m)
#define maxs (1<<(maxn*2))
#define inf (1<<30)
int n,m;
int a[maxn+5][maxn+5];
int b[maxn+5][maxn+5];
int f[maxs+5];
void readin() {
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++) {
for(int j=0;j<m;j++) {
scanf("%d",&a[i][j]);
}
}
for(int i=0;i<n;i++) {
for(int j=0;j<m;j++) {
scanf("%d",&b[i][j]);
}
}
}
int dfs(int s,int p) {
if(f[s]!=-1) return f[s];
f[s]=(p==1?-1:1)*inf;
int x=n,y=0;
for(int i=0;i<n+m-1;i++) {
if((s>>i)&1) x--;
else y++;
if(((s>>i)&3)!=1) continue;
if(p==1) f[s]=max(f[s],dfs(s^(3<<i),0)+a[x][y]);
else f[s]=min(f[s],dfs(s^(3<<i),1)-b[x][y]);
}
return f[s];
}
int main() {
readin();
memset(f,-1,sizeof(f));
f[Tstate]=0;
int ans=dfs(Sstate,1);
printf("%d",ans);
return 0;
}