2019 CCPC Qinhuangdao Invoker

Enlace de tema

Invocador

responder

Título

Dadas diez habilidades, cada habilidad requiere tres elementos para ser lanzada, y los tres elementos pueden organizarse arbitrariamente. Los jugadores pueden almacenar hasta tres elementos en sus manos. Si desea adquirir nuevos elementos, debe soltar los elementos que adquirió al principio, y debe usar uno Ry tres elementos correspondientes para liberar una determinada habilidad . Se supone que el jugador tiene ilimitado Ry Rno ocupa el puesto.
Dada una variedad de habilidades, encuentre el número mínimo de elementos necesarios.

Ideas

¡Planificación dinámica!
Cada habilidad tiene tres elementos, y los tres elementos pueden formar seis permutaciones. Usando estas seis permutaciones para la planificación dinámica, encuentre la cantidad mínima de elementos requeridos y agregue lo que necesita cada vez que libera la habilidad, que es lo que desea R.
Preste atención a múltiples conjuntos de entradas para esta pregunta.

Código 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;
}

Supongo que te gusta

Origin blog.csdn.net/qq_45934120/article/details/108887783
Recomendado
Clasificación