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 }

 

posted @ 2018-10-22 14:09  congmingyige  阅读(163)  评论(0编辑  收藏  举报