bzoj1294: [SCOI2009]围豆豆Bean

传送门

题解

//Achen
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<cstdio>
#include<queue>
#include<cmath>
const int N=12,UP=517;
#define For(i,a,b) for(int i=(a);i<=(b);i++)
#define Rep(i,a,b) for(int i=(a);i>=(b);i--)
typedef long long LL;
typedef double db;
using namespace std;
int n,m,d,vv[N],a[N][N],tx[4]={0,0,1,-1},ty[4]={1,-1,0,0},f[N][N][UP];
int vis[N][N][UP],ans,up,xx[N],yy[N],val[UP];
char s[N];

template<typename T>void read(T &x)  {
    char ch=getchar(); x=0; T f=1;
    while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
    if(ch=='-') f=-1,ch=getchar();
    for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0'; x*=f;
}

int in(int x,int y) { return x>=1&&x<=n&&y>=1&&y<=m&&a[x][y]==0; } 

struct node {
    int x,y,s;
    node(int x,int y,int s):x(x),y(y),s(s){}
};
queue<node>que;
void spfa(int x,int y) {
    memset(f,127,sizeof(f));
    que.push(node(x,y,0));
    f[x][y][0]=0;
    while(!que.empty()) {
        node tp=que.front();
        que.pop();
        vis[tp.x][tp.y][tp.s]=0;
        For(i,0,3) if(in(tp.x+tx[i],tp.y+ty[i])) {
            node z=node(tp.x+tx[i],tp.y+ty[i],tp.s);
            if(i>=2) {
                For(j,1,d) if(xx[j]==max(z.x,tp.x)&&yy[j]<z.y) 
                    z.s^=(1<<(j-1));
            }
            if(f[z.x][z.y][z.s]>f[tp.x][tp.y][tp.s]+1) {
                if(z.x==2&&z.y==5&&z.s==4) {
                    int debug=1;
                }
                f[z.x][z.y][z.s]=f[tp.x][tp.y][tp.s]+1;
                if(!vis[z.x][z.y][z.s]) {
                    vis[z.x][z.y][z.s]=1;
                    que.push(z); 
                }
            }        
        } 
    }
}

int main() {
#ifdef DEBUG
    freopen(".in","r",stdin);
    freopen(".out","w",stdout);
#endif
    read(n); read(m); read(d);
    For(i,1,d) read(vv[i]);
    For(i,1,UP) 
        For(j,1,d) if(i&(1<<(j-1))) 
            val[i]+=vv[j];
    For(i,1,n) {
        scanf("%s",s+1);
        For(j,1,m) {
            if(s[j]=='#') a[i][j]=-1;
            else a[i][j]=s[j]-'0';
            if(a[i][j]>0) xx[a[i][j]]=i,yy[a[i][j]]=j;
        }
    }
    up=(1<<d)-1;
    For(i,1,n) For(j,1,m) if(!a[i][j]) {
        spfa(i,j);
        For(k,1,up) 
            ans=max(ans,val[k]-f[i][j][k]);
    }
    printf("%d
",ans);
    return 0;
}
/*
3 8
3
30 -100 30
00000000
010203#0
00000000
*/
View Code
原文地址:https://www.cnblogs.com/Achenchen/p/8604413.html