I - Invoker(DP)

思路: d p dp dp。

难点在于状态较多,打表起来有点复杂。

时间复杂度: O ( 36 n ) O(36n) O(36n)

具体看代码。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
#define mst(a,b) memset(a,b,sizeof a)
#define lx x<<1
#define rx x<<1|1
#define reg register
#define PII pair<int,int>
#define fi first
#define se second
#define pb push_back
#define IOS ios::sync_with_stdio(false),cin.tie(0)
string ski[10][6]={
{"QQQ","QQQ","QQQ","QQQ","QQQ","QQQ"},
{"QQW","QWQ","QQW","QWQ","WQQ","WQQ"},
{"QQE","QEQ","QQE","QEQ","EQQ","EQQ"},
{"WWW","WWW","WWW","WWW","WWW","WWW"},
{"QWW","QWW","WQW","WWQ","WQW","WWQ"},
{"WWE","WEW","WWE","WEW","EWW","EWW"},
{"EEE","EEE","EEE","EEE","EEE","EEE"},
{"QEE","QEE","EQE","EEQ","EQE","EEQ"},
{"WEE","WEE","EWE","EEW","EWE","EEW"},
{"QWE","QEW","WQE","WEQ","EQW","EWQ"}
};
char ch[10]={'Y','V','G','C','X','Z','T','F','D','B'};
map<char,int>mp;
int a[15][6][15][6];
int dp[N][6];
int main(){
IOS;
for(int i=0;i<10;i++) mp[ch[i]]=i;
for(int i=0;i<10;i++)
for(int j=0;j<10;j++)
for(int k=0;k<6;k++)
for(int h=0;h<6;h++)
{
if(ski[i][k]==ski[j][h]) continue;
else if(ski[i][k].substr(1)==ski[j][h].substr(0,2)) a[i][k][j][h]=1;
else if(ski[i][k][2]==ski[j][h][0]) a[i][k][j][h]=2;
else a[i][k][j][h]=3;
}
string s;
cin>>s;
int n=s.size();
mst(dp,0x3f);
for(int i=0;i<6;i++) dp[0][i]=3;
for(int i=1;i<n;i++)
for(int j=0;j<6;j++)
for(int k=0;k<6;k++)
dp[i][k]=min(dp[i][k],dp[i-1][j]+a[mp[s[i-1]]][j][mp[s[i]]][k]);
int ans=1e9;
for(int i=0;i<6;i++) ans=min(ans,dp[n-1][i]);
printf("%d\n",ans+n);
return 0;
}