Time Limit: 15000/12000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 117 Accepted Submission(s): 35
#include<bits/stdc++.h> using namespace std; const int size=1e5+5; const int inf=0x3f3f3f3f; char ss[size]; int dp[size][5][5]; int ans[size]; char s[15][5]={"QQQ","QQW","QQE","WWW","QWW","WWE","EEE","QEE","WEE","QWE"}; int stru[6][3]={{0,1,2},{0,2,1},{1,0,2},{1,2,0},{2,1,0},{2,0,1}}; inline int id(char c) { if(c==‘Q‘) return 0; if(c==‘W‘) return 1; if(c==‘E‘) return 2; } int ty[size]; inline int swap(char c) { if(c==‘Y‘) return 0; if(c==‘V‘) return 1; if(c==‘G‘) return 2; if(c==‘C‘) return 3; if(c==‘X‘) return 4; if(c==‘Z‘) return 5; if(c==‘T‘) return 6; if(c==‘F‘) return 7; if(c==‘D‘) return 8; if(c==‘B‘) return 9; } int main() { while(~scanf("%s",ss+1)) { int len=strlen(ss+1); for(int i=0;i<=len;i++) { for(int j=0;j<=2;j++) { for(int k=0;k<=2;k++) { dp[i][j][k]=inf; } } } for(int i=1;i<=len;i++) { ty[i]=swap(ss[i]); ans[i]=inf; } ans[1]=3; dp[1][id(s[ty[1]][0])][id(s[ty[1]][1])]=3; dp[1][id(s[ty[1]][0])][id(s[ty[1]][2])]=3; dp[1][id(s[ty[1]][1])][id(s[ty[1]][0])]=3; dp[1][id(s[ty[1]][1])][id(s[ty[1]][2])]=3; dp[1][id(s[ty[1]][2])][id(s[ty[1]][1])]=3; dp[1][id(s[ty[1]][2])][id(s[ty[1]][0])]=3; for(int i=2;i<=len;i++) { if(ty[i]==ty[i-1]) { for(int j=0;j<=2;j++) { for(int k=0;k<=2;k++) { dp[i][j][k]=dp[i-1][j][k]; } } ans[i]=ans[i-1]; continue; } dp[i][id(s[ty[i]][0])][id(s[ty[i]][1])]=3+ans[i-1]; dp[i][id(s[ty[i]][0])][id(s[ty[i]][2])]=3+ans[i-1]; dp[i][id(s[ty[i]][1])][id(s[ty[i]][0])]=3+ans[i-1]; dp[i][id(s[ty[i]][1])][id(s[ty[i]][2])]=3+ans[i-1]; dp[i][id(s[ty[i]][2])][id(s[ty[i]][1])]=3+ans[i-1]; dp[i][id(s[ty[i]][2])][id(s[ty[i]][0])]=3+ans[i-1]; for(int j=0;j<6;j++) { dp[i][id(s[ty[i]][stru[j][1]])][id(s[ty[i]][stru[j][2]])]=min(dp[i][id(s[ty[i]][stru[j][1]])][id(s[ty[i]][stru[j][2]])],dp[i-1][id(s[ty[i]][stru[j][0]])][id(s[ty[i]][stru[j][1]])]+1); for(int k=0;k<=2;k++) dp[i][id(s[ty[i]][stru[j][1]])][id(s[ty[i]][stru[j][2]])]=min(dp[i][id(s[ty[i]][stru[j][1]])][id(s[ty[i]][stru[j][2]])],dp[i-1][k][id(s[ty[i]][stru[j][0]])]+2); ans[i]=min(ans[i],dp[i][id(s[ty[i]][stru[j][1]])][id(s[ty[i]][stru[j][2]])]); } } printf("%d\n",ans[len]+len); } return 0; }
原文:https://www.cnblogs.com/songorz/p/11604647.html