IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> Invoker(预处理+dp) -> 正文阅读

[数据结构与算法]Invoker(预处理+dp)

Invoker

[Link](Problem - 6739 (hdu.edu.cn))

题意

你有三个小技能,每使用一个小技能就会给你的卡槽留下一个相应的标记,卡槽最多有三个标记,当有一个新的标记到来且没有位置时最先到的标记被移除,依次顺移。卡槽内三个标记不同的无序组合可以放出不同的大招,当有三个标记后就可以放大招啦。现在给你一个大招序列,问你最少用多少次操作可以把这个大招序列发出去。

题解

首先发现每一个大招就确定了三个无序的标记,它是不符合局部贪心到整体最优的。但是假设当前到了第i位,那么从开始到第i位的所有操作,是有一个最优解的且和后面的操作无关。因此想到的dp,那么怎么考虑设计维度可以补充不漏的把状态表示出来呢?首先假设当前到了第i位,那么第i-1位时什么情况下他是最优的呢,这个是无法直接判断了因此我们要加一维来表示前一个大招的标记情况。我们假设
f [ i , j ] 表 示 到 第 i 个 大 招 且 是 第 j 种 标 记 情 况 的 最 小 操 作 次 数 f[i,j]表示到第i个大招且是第j种标记情况的最小操作次数 f[i,j]ij
然后就可以直接暴力转移了。

Code

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <set>
#include <queue>
#include <vector>
#include <map>
#include <bitset>
#include <unordered_map>
#include <cmath> 
#include <stack>
#include <iomanip>
#include <deque> 
#include <sstream>
#define x first
#define y second
using namespace std;
typedef long double ld;
typedef long long LL;
typedef pair<int, int> PII;
typedef pair<double, double> PDD;
typedef unsigned long long ULL;
const int N = 1e5 + 10, M = 2 * N, INF = 0x3f3f3f3f, mod = 1e9 + 7;
const double eps = 1e-8;
int dx[] = {-1, 0, 1, 0}, dy[] = {0, 1, 0, -1};
int h[N], e[M], ne[M], w[M], idx;
void add(int a, int b, int v = 0) {
    e[idx] = b, w[idx] = v, ne[idx] = h[a], h[a] = idx ++;
}
int n, m, k;
int a[N];
char dic[10][6][4] {
    {"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","WQW","WWQ"},
    {"WWE","WEW","EWW","WWE","WEW","EWW"},
    {"EEE","EEE","EEE","EEE","EEE","EEE"},
    {"QEE","EQE","EEQ","QEE","EQE","EEQ"},
    {"WEE","EWE","EEW","WEE","EWE","EEW"},
    {"QWE","QEW","WQE","WEQ","EWQ","EQW"},
};
map<char, int> mp;
int s[N];
string str;
int f[N][6];
int get(int v1, int v2, int p1, int p2) {
    if (dic[v1][p1][0] == dic[v2][p2][0] && dic[v1][p1][1] == dic[v2][p2][1] && dic[v1][p1][2] == dic[v2][p2][2])   return 0;
    if (dic[v1][p1][1] == dic[v2][p2][0] && dic[v1][p1][2] == dic[v2][p2][1]) return 1;
    if (dic[v1][p1][2] == dic[v2][p2][0])   return 2;
    return 3;
}
int main() {
    ios::sync_with_stdio(false), cin.tie(0);
    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(cin >> str) {
        int res = 0, cnt = 0;
        for (int i = 0; i < str.size(); i ++ ) s[i + 1] = mp[str[i]];
        memset(f, 0x3f, sizeof f);
        for (int i = 0; i < 6; i ++ ) f[1][i] = 3;
        for (int i = 2; i <= str.size(); i ++ )
            for (int j = 0; j < 6; j ++ )
                for (int k = 0; k < 6; k ++ )   
                    f[i][j] = min(f[i][j], f[i - 1][k] + get(s[i-1], s[i], k, j));
        int mn = INF;
        for (int i = 0; i < 6; i ++ )   mn = min(mn, f[str.size()][i]);
        cout << mn + str.size()  << endl;
    }
    return 0;
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章           查看所有文章
加:2021-10-23 12:44:52  更:2021-10-23 12:47:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 8:38:25-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码