Codeforces Round #517 (Div. 2, based on Technocup 2019 Elimination Round 2) D. Minimum path
http://codeforces.com/contest/1072/problem/D
bfs
走1步的最佳状态 -> 走2步的最佳状态 -> ……
1 #include <bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 #define minv 1e-6 5 #define inf 1e9 6 #define pi 3.1415926536 7 #define nl 2.7182818284 8 const ll mod=1e9+7;//998244353 9 const int maxn=2e3+10; 10 11 struct node 12 { 13 int x,y; 14 }q[maxn*2][maxn]; 15 16 int ci[maxn][maxn],g[maxn*2]; 17 char ch[maxn][maxn],s[maxn][maxn],str[maxn*2]; 18 19 int main() 20 { 21 int n,maxci,x,y,c,xx,yy,u,v,i,ii,j; 22 scanf("%d%d",&n,&maxci); 23 for (i=1;i<=n;i++) 24 scanf("%s",s[i]+1); 25 for (i=1;i<=n;i++) 26 for (j=1;j<=n;j++) 27 ch[i][j]='z'+1; 28 29 g[0]=1,q[0][1].x=1,q[0][1].y=1; 30 if (maxci==0 && s[1][1]!='a') 31 { 32 ci[1][1]=0; 33 ch[1][1]=s[1][1]; 34 } 35 else 36 { 37 ci[1][1]=maxci-(s[1][1]!='a'); 38 ch[1][1]='a'; 39 } 40 printf("%c",ch[1][1]); 41 42 for (i=1;i<=n+n-2;i++) 43 { 44 ii=i-1; 45 for (j=1;j<=g[ii];j++) 46 { 47 x=q[ii][j].x; 48 y=q[ii][j].y; 49 c=ci[x][y]; 50 if (x!=n) 51 { 52 xx=x+1; 53 yy=y; 54 55 if (c==0 && s[xx][yy]!='a') 56 { 57 u=0; 58 v=s[xx][yy]; 59 } 60 else 61 { 62 u=c-(s[xx][yy]!='a'); 63 v='a'; 64 } 65 66 if (v<ch[xx][yy] || (v==ch[xx][yy] && u>ci[xx][yy])) 67 ci[xx][yy]=u,ch[xx][yy]=v; 68 } 69 70 if (y!=n) 71 { 72 xx=x; 73 yy=y+1; 74 75 if (c==0 && s[xx][yy]!='a') 76 { 77 u=0; 78 v=s[xx][yy]; 79 } 80 else 81 { 82 u=c-(s[xx][yy]!='a'); 83 v='a'; 84 } 85 86 if (v<ch[xx][yy] || (v==ch[xx][yy] && u>ci[xx][yy])) 87 ci[xx][yy]=u,ch[xx][yy]=v; 88 } 89 } 90 91 v='z'; 92 for (x=1;x<=n;x++) 93 { 94 y=i+2-x; 95 if (y>=1 && y<=n && ch[x][y]!='z'+1) 96 { 97 if (ch[x][y]<v) 98 { 99 v=ch[x][y]; 100 g[i]=1; 101 q[i][1].x=x,q[i][1].y=y; 102 } 103 else if (ch[x][y]==v) 104 { 105 g[i]++; 106 q[i][g[i]].x=x,q[i][g[i]].y=y; 107 } 108 } 109 } 110 printf("%c",v); 111 } 112 return 0; 113 }