首页 > 其他分享 >【题解】HDOJ 7329 [2023杭电多校] Touhou Red Red Blue

【题解】HDOJ 7329 [2023杭电多校] Touhou Red Red Blue

时间:2023-08-02 15:25:19浏览次数:68  
标签:Blue 口袋 UFO int 题解 dp Red define

题目传送门:HDOJ 7329 [2023杭电多校] Touhou Red Red Blue

题意

有两个口袋(口袋容量为1,初始均为空),有若干个UFO按顺序来到你的面前,每个UFO有一个颜色(GRB),你可以选择 扔掉 它或者把它 装进口袋 中,如果口袋1空着必须装进口袋1;

如果口袋都满了,算上面前的UFO共有三个,有如下三种情况:

  • 如果三个颜色均相同:可以消掉并获得一分(得分唯一途径),并任意选择一个颜色的UFO装进口袋1
  • 如果三个颜色两辆均不同:可以消掉并选择任意两个颜色UFO装进口袋
  • 其他情况:把第一个扔了,第二个放进口袋1,第三个放进口袋2

输入为字符串 \(str\) 仅包括 \(R,G,B\) ,\(|str| \le 10^5\) ,询问最多得分是多少

分析

扔掉或者装进口袋,很明显的背包 \(dp\) ,简单 \(dp\)

题解

\(dp_{i,j,k}\) 表示面前是第 \(i\) 个UFO,切目前背包1中装的是 \(j\),背包2中装的是 \(k\),按照题意模拟每种情况即可,注意可能有很多种前面的状态导致同一个后续状态,因此更新 \(dp\) 时每次要取 \(max\)

AC代码

#include<bits/stdc++.h>
#define int long long
#define cin std::cin
#define cout std::cout
#define fastio ios::sync_with_stdio(0), cin.tie(nullptr)
using namespace std;
const int N = 1e5 + 10;
const int mod = 998244353;
const int inf = 0x3fffffffffffffff;
char buf[1<<21],*p1=buf,*p2=buf;
inline char getc(){
    return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;
}
inline int read(){
    int ret = 0,f = 0;char ch = getc();
    while (!isdigit (ch)){
        if (ch == '-') f = 1;
        ch = getc();
    }
    while (isdigit (ch)){
        ret = ret * 10 + ch - 48;
        ch = getc();
    }
    return f?-ret:ret;
}
string s;
int dp[N][5][5];
inline void init() {
    memset(dp, -0x3f, sizeof(dp));
}
inline void solve() {
    cin >> s;
    int len = s.length();
    dp[0][0][0] = 0;
    for(int i = 1; i <= len; ++i) {
        if(s[i - 1] == 'R') {
            dp[i][0][0] = dp[i][1][0] = dp[i - 1][0][0];
            for(int j = 1; j < 4; ++j) {
                dp[i][j][1] = max(dp[i - 1][j][0], dp[i][j][1]);
                dp[i][j][0] = max(dp[i - 1][j][0], dp[i][j][0]);
                for(int k = 1; k < 4; ++k) {
                    dp[i][j][k] = max(dp[i - 1][j][k], dp[i][j][k]);
                    if(j != k && j != 1 && k != 1) {
                        for(int x = 1; x < 4; ++x) {
                            for(int y = 1; y < 4; ++y) {
                                dp[i][x][y] = max(dp[i - 1][j][k], dp[i][x][y]);
                            }
                        }
                    }
                    else if(j == 1 && k == 1) {
                        for(int x = 1; x < 4; ++x) {
                            dp[i][x][0] = max(dp[i - 1][j][k] + 1, dp[i][x][0]);
                        }
                    }
                    else {
                        dp[i][k][1] = max(dp[i - 1][j][k], dp[i][k][1]);
                    }
                }
            }
        }
        if(s[i - 1] == 'B') {
            dp[i][0][0] = dp[i][2][0] = dp[i - 1][0][0];
            for(int j = 1; j < 4; ++j) {
                dp[i][j][2] = max(dp[i - 1][j][0], dp[i][j][2]);
                dp[i][j][0] = max(dp[i - 1][j][0], dp[i][j][0]);
                for(int k = 1; k < 4; ++k) {
                    dp[i][j][k] = max(dp[i - 1][j][k], dp[i][j][k]);
                    if(j != k && j != 2 && k != 2) {
                        for(int x = 1; x < 4; ++x) {
                            for(int y = 1; y < 4; ++y) {
                                dp[i][x][y] = max(dp[i - 1][j][k], dp[i][x][y]);
                            }
                        }
                    }
                    else if(j == 2 && k == 2) {
                        for(int x = 1; x < 4; ++x) {
                            dp[i][x][0] = max(dp[i - 1][j][k] + 1, dp[i][x][0]);
                        }
                    }
                    else {
                        dp[i][k][2] = max(dp[i - 1][j][k], dp[i][k][2]);
                    }
                }
            }
        }
        if(s[i - 1] == 'G') {
            dp[i][0][0] = dp[i][3][0] = dp[i - 1][0][0];
            for(int j = 1; j < 4; ++j) {
                dp[i][j][3] = max(dp[i - 1][j][0], dp[i][j][3]);
                dp[i][j][0] = max(dp[i - 1][j][0], dp[i][j][0]);
                for(int k = 1; k < 4; ++k) {
                    dp[i][j][k] = max(dp[i - 1][j][k], dp[i][j][k]);
                    if(j != k && j != 3 && k != 3) {
                        for(int x = 1; x < 4; ++x) {
                            for(int y = 1; y < 4; ++y) {
                                dp[i][x][y] = max(dp[i - 1][j][k], dp[i][x][y]);
                            }
                        }
                    }
                    else if(j == 3 && k == 3) {
                        for(int x = 1; x < 4; ++x) {
                            dp[i][x][0] = max(dp[i - 1][j][k] + 1, dp[i][x][0]);
                        }
                    }
                    else {
                        dp[i][k][3] = max(dp[i - 1][j][k], dp[i][k][3]);
                    }
                }
            }
        }
    }
    int ans = -1;
    for(int i = 0; i < 4; ++i) {
        for(int j = 0; j < 4; ++j) {
            ans = max(ans, dp[len][i][j]);
        }
    }
    cout << ans << endl;
    return;
}
signed main() {
    fastio;
    int T;
    cin >> T;
    while(T --) {
        init();
        solve();
    }
    return 0;
}

标签:Blue,口袋,UFO,int,题解,dp,Red,define
From: https://www.cnblogs.com/marti88414/p/17600757.html

相关文章

  • 解决 Vue 重复点击相同路由,出现 Uncaught (in promise) NavigationDuplicated: Avoide
    解决Vue重复点击相同路由,出现Uncaught(inpromise)NavigationDuplicated:Avoidedredundantnavigation问题问题问题描述:重复点击导航时,控制台出现报错,虽然不影响功能使用,但也不能视而不见。解决方案方案一:只需在router文件夹下,添加如下代码。constrouter=new......
  • RHEL/RedHat:Linux虚拟机安装minikube
    学习自容器与云|如何在RHEL8上安装MiniKube(主要参考这个)第五篇:minikube安装使用这个教程装了两步之后发现是Centos,而我的是rhel,遂放弃系统相关Linux服务器:Linuxrhel1.myguest.virtualbox.org3.10.0-1160.el7.x86_64#1SMPTueAug1814:50:17EDT2020x86_64x86_......
  • Redis的单线程设计之谜:高性能与简洁并存
    Redis作为一款高性能的内存数据库,以其出色的读写性能和多种数据结构支持而闻名。然而,与其他传统数据库不同,Redis采用了独特的单线程设计。在本文中,我们将揭开Redis单线程设计的奥秘,解释其为何能在单线程下实现高性能,并探讨适用场景与优势。1.Redis单线程模型Redis的单线程模型意味......
  • NOI2023 题解
    打的太shaber了,于是补补题。D1T1扫描线。首先我们可以容斥一下,答案为被一种操作覆盖到的减去被两种操作覆盖到的加上被三种操作覆盖到的。首先考虑只被一种操作覆盖到的,这很简单,直接上个区间颜色段推平就好了,顺便去了个重。接下来是有被斜线覆盖到的,这样的点数为\(O(nk)\)......
  • scrapy源码分析:redis分布式爬虫队列中,priority值越大,优先级越高
    scrapy源码分析:redis分布式爬虫队列中,priority值越大,优先级越高一、背景scrapy爬虫项目中,遇到scrapy的priority属性,搞不懂priority的值越大优先级越高,还是值越小优先级越高#通过priority修改优先级returnscrapy.Request(url=request.url,dont_filter=True,callback=spider......
  • 解决redhat不能使用yml指令的问题
    yum remove subscription-manager卸载redhat订阅提示,不然每次都提示你去注册This system is not registered to Red Hat Subscription Managementcurl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-8.repo配置centos8的源yum mak......
  • 因MySQL数据库无法启动导致LiteCVR视频平台也无法启动的问题解决教程
    近期呢,我们的数据人员发现有时候MySQL数据库无法启动会导致LiteCVR视频平台也无法启动,所以接下来我们将为大家讲解遇见这种问题时的解决教程。但是在这之前值得一提的一件事那就是我们的LiteCVR平台默认的数据库是SQLite,不过用户可以根据自己的使用需求选择将数据库切换为MySQL。具......
  • [MySQL] 调用定时器时event_scheduler是Off问题解决
    永久解决方法:修改MySQL配置文件,设置event_scheduler=ONvi/etc/my.cnf在[mysqld]下添加一行重启mysql服务event_scheduler=ON临时方法执行mysql语句1、查看事件调度器状态showVARIABLESlike'event_scheduler'......
  • Redis 发生高延迟时
    Redis是一种内存数据库,将数据保存在内存中,读写效率要比传统的将数据保存在磁盘上的数据库要快很多。但是Redis也会发生延迟时,这是就需要我们对其产生原因有深刻的了解,以便于快速排查问题,解决Redis的延迟问题一条命令执行过程在本文场景下,延迟(latency)是指从客户端发送命......
  • Redis从入门到放弃(6):持久化
    1、引言Redis作为一种高性能的内存数据存储系统,常被用作缓存、会话存储、消息队列等多种应用场景。然而,由于其数据存储在内存中,一旦发生意外或服务器重启,数据就会丢失。为了保障数据的持久性和安全性。Redis提供了多种持久化方案:RDB(RedisDataBase):按指定的时间间隔执行数据集......