2019 CCPC 秦皇岛 Invoker

题目链接

Invoker

题解

题意

给出十个技能,每个技能需要有三个元素才能释放,其中三个元素可以任意排列。玩家手中最多存储三个元素,若想获取新的元素则需要放掉最开始的时候获得的元素,释放某个技能需要使用一个R和三个对应的元素。假定玩家拥有无限个RR不占位置。
给出一个技能数组,求所需最少的元素数量。

思路

动态规划!
每个技能有三个元素,三个元素可以构成六个排列,利用这六个排列进行动态规划,找到所需最少的元素数量后加上每次释放技能时要用的R,即为所求。
注意该题多组输入。

AC代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<string>
#include<queue>
#include<map>
#include<stack>
#include<list>
#include<set>
#include<deque>
#include<vector>
#include<ctime>

using namespace std;
//#pragma GCC optimize(2)
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define ull unsigned long long
#define ll long long
#define rep(i, x, y) for(int i=x;i<=y;i++)
#define mms(x, n) memset(x, n, sizeof(x))
/// mms中使用 0x3f 可以使得其初始化为INF
#define mmc(A, tree) memcpy(A, tree, sizeof(tree))
#define eps (1e-8)
#define PI (acos(-1.0))
#define INF (0x3f3f3f3f)
#define mod (ll)(1e9+7)
typedef pair<int, int> P;

int const N = 1e6 + 10;
char in[N];
char ch[20][12][10] = {
    
    
        {
    
    "QQQ", "QQQ", "QQQ", "QQQ", "QQQ", "QQQ"},
        {
    
    "QQW", "QWQ", "WQQ", "QQW", "QWQ", "WQQ"},
        {
    
    "QQE", "QEQ", "EQQ", "QQE", "QEQ", "EQQ"},
        {
    
    "WWW", "WWW", "WWW", "WWW", "WWW", "WWW"},
        {
    
    "QWW", "WQW", "WWQ", "QWW", "WWQ", "WQW"},
        {
    
    "WWE", "EWW", "WEW", "WWE", "WEW", "EWW"},
        {
    
    "EEE", "EEE", "EEE", "EEE", "EEE", "EEE"},
        {
    
    "QEE", "EQE", "EEQ", "QEE", "EEQ", "EQE"},
        {
    
    "WEE", "EWE", "EEW", "EEW", "EWE", "WEE"},
        {
    
    "QWE", "WQE", "WEQ", "QEW", "EQW", "EWQ"},
};
int dp[N][10];
map<char, int> mp;

int check(int now, int init, int pos_now, int pos_init) {
    
    
    if (ch[init][pos_init][0] == ch[now][pos_now][0] && ch[init][pos_init][1] == ch[now][pos_now][1] && ch[init][pos_init][2] == ch[now][pos_now][2]) return 0;
    else if (ch[init][pos_init][1] == ch[now][pos_now][0] && ch[init][pos_init][2] == ch[now][pos_now][1]) return 1;
    else if (ch[init][pos_init][2] == ch[now][pos_now][0]) return 2;
    else return 3;
}

int main() {
    
    
#ifndef ONLINE_JUDGE
    freopen("input.txt", "r", stdin);
#endif
    mp['Y'] = 0;
    mp['V'] = 1;
    mp['G'] = 2;
    mp['C'] = 3;
    mp['X'] = 4;
    mp['Z'] = 5;
    mp['T'] = 6;
    mp['F'] = 7;
    mp['D'] = 8;
    mp['B'] = 9;
    while (scanf("%s", in) != EOF){
    
    
        int n = strlen(in);
        mms(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][j] = min(dp[i][j], dp[i - 1][k] + check(mp[in[i]], mp[in[i - 1]], j, k));
                }
            }
        }
        int ans = dp[n-1][0];
        for (int i = 0; i < 6; i++) {
    
    
            ans = min(ans, dp[n - 1][i]);
        }
        printf("%d\n", ans + n);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_45934120/article/details/108887783
今日推荐