标签:style class blog http tar com
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1294
题意:
思路:f[i][j][st]表示从(i,j)出 发到(i,j)停止组成的回路、状态为st的最小步数。从每个0的位置(i,j)进行BFS一次,得到所有的状态。判断一个路径是否包含某个格子时,可以 从该格子向左发出一条射线,判断这条射线与路径交点个数。为奇数时包含。
char s[N][N]; int f[N][N][1<<9]; int a[N],n,m,K; int b[N][2]; int dx[]={0,0,1,-1}; int dy[]={1,-1,0,0}; struct node { int x,y,st; node(){} node(int _x,int _y,int _st) { x=_x; y=_y; st=_st; } }; int ok(int x,int y) { return x>=0&&x<n&&y>=0&y<m&&s[x][y]==‘0‘; } int get(int st,int x,int y,int xx) { int i; FOR0(i,K) { if(y<b[i][1]&&(x==b[i][0]&&xx>b[i][0]||x>b[i][0]&&xx==b[i][0])) { st^=1<<i; } } return st; } int cal(int x,int y) { clr(f,-1); queue<node> Q; Q.push(node(x,y,0)); f[x][y][0]=0; int i,j,xx,yy,temp,st; node p; while(!Q.empty()) { p=Q.front(); Q.pop(); FOR0(i,4) { xx=p.x+dx[i]; yy=p.y+dy[i]; if(!ok(xx,yy)) continue; st=get(p.st,p.x,p.y,xx); if(f[xx][yy][st]==-1) { f[xx][yy][st]=f[p.x][p.y][p.st]+1; Q.push(node(xx,yy,st)); } } } int ans=0; FOR0(i,(1<<K)) if(f[x][y][i]!=-1) { temp=0; FOR0(j,K) if(i&(1<<j)) temp+=a[j]; upMax(ans,temp-f[x][y][i]); } return ans; } int main() { RD(n,m,K); int i,j,k; FOR0(i,K) RD(a[i]); FOR0(i,n) { RD(s[i]); FOR0(j,m) if(s[i][j]!=‘0‘&&s[i][j]!=‘#‘) { k=s[i][j]-‘1‘; b[k][0]=i; b[k][1]=j; } } int ans=0; FOR0(i,n) FOR0(j,m) if(s[i][j]==‘0‘) upMax(ans,cal(i,j)); PR(ans); }
BZOJ 1294 围豆豆Bean(DP),布布扣,bubuko.com
标签:style class blog http tar com
原文地址:http://www.cnblogs.com/jianglangcaijin/p/3799487.html