I - Invoker(DP)

I - Invoker(DP)

思路: d p dp

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

时间复杂度: O ( 36 n ) 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;
}

猜你喜欢

转载自blog.csdn.net/weixin_45750972/article/details/107847145
I
今日推荐