四维dp+暴力
这个题看到后一点点想法都没有。
题解的方法是:暴力处理出用a和b处理i—>j的最小步数。那么之后O(n)模拟就好了。
写dfs的时候有一个小(大)坑,u—>u的步数不是0,所以写bfs的时候一定要注意。
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int maxn=100+5; 5 const int inf=9999999; 6 7 8 int Time[11][11][11][11]; 9 int Sime[11][11][11][11];struct node{ 10 int x; 11 int step; 12 node(int _x,int _step) { 13 x=_x; 14 step=_step; 15 } 16 node(){ 17 } 18 }; 19 20 int bfs(int c1,int c2,int u,int v) 21 { 22 int vis[11]; 23 for(int i=0;i<10;i++) vis[i]=0; 24 queue <node> Q;Q.push(node(u,0)); 25 while(!Q.empty()){ 26 node now=Q.front();Q.pop(); 27 if(now.x==v&&vis[now.x]) return now.step; 28 if(!vis[(now.x+c1)%10]) { 29 Q.push(node((now.x+c1)%10,now.step+1)); vis[(now.x+c1)%10]=1;} 30 if(!vis[(now.x+c2)%10]){ 31 Q.push(node((now.x+c2)%10,now.step+1)); vis[(now.x+c2)%10]=1;} 32 } 33 return -1; 34 } 35 36 37 38 void solve(){ 39 string str;cin>>str; 40 for(int i=0;i<10;i++) 41 for(int j=0;j<10;j++) 42 for(int a=0;a<10;a++) 43 for(int b=0;b<10;b++) 44 { 45 Time[i][j][a][b]=bfs(i,j,a,b); 46 } 47 48 49 50 //cout <<"sig"; 51 for(int i=0;i<10;i++) 52 { 53 for(int j=0;j<10;j++){ 54 ll sum=0;int flag=1; 55 for(int a=1;a<str.size();a++){ 56 if(Time[i][j][str[a-1]-'0'][str[a]-'0']==-1) 57 { 58 cout <<-1<<" "; 59 flag=0;break; 60 }else 61 { 62 sum+=Time[i][j][str[a-1]-'0'][str[a]-'0']; 63 } 64 } 65 if(flag) cout <<sum-str.size()+1<<" "; 66 } 67 cout <<endl; 68 } 69 70 71 } 72 int main(){ 73 solve(); 74 return 0; 75 }