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 }

浙公网安备 33010602011771号