hdu 6739 Invoker ###K //K

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6739

题意:给一串技能对应按键 问如何按使得按键最少

思路:没有贪心策略 只能考虑dp来做 每种技能排列组合有6种顺序,那么dp[i][6] 来表示第i种技能的第j种组合需要多少次按键即可

每次的每个技能组合和上一次技能的6种组合比较       注意hdu是多组输入

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 #define pb push_back
 5 const int maxn =1e5+10;
 6 const int mod=1e9+7;
 7 int dp[maxn][6];
 8 string c[10]={{"QQQQQQQQQQQQQQQQQQ"},{"QQWQWQQQWQWQWQQWQQ"},{"QQEQEQQQEQEQEQQEQQ"},{"WWWWWWWWWWWWWWWWWW"},{"QWWQWWWQWWWQWQWWWQ"},{"WWEWEWWWEWEWEWWEWW"},{"EEEEEEEEEEEEEEEEEE"},{"QEEQEEEQEEEQEQEEEQ"},{"WEEWEEEWEEEWEWEEEW"},{"QWEQEWWQEWEQEQWEWQ"}};
 9 
10 
11 
12 int main()
13 {
14     ios::sync_with_stdio(false);
15     cin.tie(0);
16     map<char,int>mp;
17     mp['Y']=0;
18     mp['V']=1;
19     mp['G']=2;
20     mp['C']=3;
21     mp['X']=4;
22     mp['Z']=5;
23     mp['T']=6;
24     mp['F']=7;
25     mp['D']=8;
26     mp['B']=9;
27     string s;
28     while(cin>>s)
29     {
30         int n=s.size();
31         for(int i=1;i<=n;i++)
32             for(int j=0;j<6;j++)
33                 dp[i][j]=1e9;
34         int ans=1e9;
35         for(int i=1;i<=n;i++)
36         {
37             char d=s[i-1];
38             for(int j=0;j<6;j++)
39             {
40                 string g;
41                 g+=c[mp[d]][j*3];
42                 g+=c[mp[d]][j*3+1];
43                 g+=c[mp[d]][j*3+2];
44                 if(i==1)
45                 {
46                     dp[i][j]=3;
47                     continue;
48                 }
49                 for(int y=0;y<6;y++)
50                 {
51                     char e=s[i-2];
52                     string k;
53                     int temp=3;
54                     k+=c[mp[e]][y*3];
55                     k+=c[mp[e]][y*3+1];
56                     k+=c[mp[e]][y*3+2];
57                     if(k[2]==g[0])
58                         temp=2;
59                     if(k[1]==g[0]&&k[2]==g[1])
60                         temp=1;
61                     if(k[0]==g[0]&&k[1]==g[1]&&k[2]==g[2])
62                         temp=0;
63                     dp[i][j]=min(dp[i][j],dp[i-1][y]+temp);
64                 }
65             }
66         }
67         for(int i=0;i<6;i++)
68             ans=min(ans,dp[n][i]);
69         cout<<ans+n<<'\n';
70     }
71 
72 
73 
74 
75 }
View Code

 

posted @ 2020-09-24 20:09  canwinfor  阅读(206)  评论(0)    收藏  举报