首页 > 其他分享 > D. Bear and Company (cf771D)

D. Bear and Company (cf771D)

时间:2023-01-28 22:55:21浏览次数:64  
标签:std cnt const int Company cf771D Bear ++ dp

D. Bear and Company (cf771D)

tag:dp

题目链接

题意:

给你一串长度为n的字符串,(2<=n<=75),字母全为大写字母,你可以通过一次操作交换任意一对相邻字母。
字符串合法当且仅当不存在”VK“的字串,问你最少通过几次操作使得字符串合法。

做法:

首先观察到n很小,多开几维是必须的
我们设 dp[i][j][k][0/1],表示当前串有i个V,j个K,k个其他字母组成,最后一个字母是否为V
另外,若相邻两字符相同,则交换后的串还是一样,交换没有意义,所以对于相同的字母来说,他们的相对位置不变
下面考虑状态转移
假设我们此时要在串的末尾插入一个字符,我们要让它从原位置到目前的最后,就相当于做一次冒泡,那么我们拿他的原始位置和其他两种已经插入的字符原始位置比较,逆序对个数就是代价

代码:

#define fst std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout << std::fixed << std::setprecision(20)
#define le "\n"
#define ll long long 
#include <bits/stdc++.h>
using namespace std;
const int N= 80;
const int mod=998244353;
const int INF = 0x3f3f3f3f;
vector<int> a,b,c;
int dp[N][N][N][2]; 

int main(){
    int n; cin>>n;
    string s; cin>>s;
    s = " "+s; 
    for(int i=1;i<=n;i++){
        if(s[i]=='V') a.push_back(i); 
        else if(s[i]=='K') b.push_back(i); 
        else c.push_back(i);
    }
    int sa = a.size(),sb = b.size(),sc = c.size();

    for(int i=0;i<=sa;i++){
        for(int j=0;j<=sb;j++){
            for(int k=0;k<=sc;k++){
                if(i+j+k==0) continue;
                dp[i][j][k][0] = dp[i][j][k][1] = INF;
                if(i){
                    dp[i][j][k][1] = min(dp[i-1][j][k][0],dp[i-1][j][k][1]);
                    for(int t=0;t<j;t++) if(b[t]>a[i-1]) dp[i][j][k][1]++;
                    for(int t=0;t<k;t++) if(c[t]>a[i-1]) dp[i][j][k][1]++;
                }
                if(j){
                    int cnt=dp[i][j-1][k][0]; //如果上一串结尾是V,显然不能放K
                    for(int t=0;t<i;t++) if(a[t]>b[j-1]) cnt++;
                    for(int t=0;t<k;t++) if(c[t]>b[j-1]) cnt++;
                    dp[i][j][k][0]=min(dp[i][j][k][0],cnt);
                }
                if(k){
                    int cnt=min(dp[i][j][k-1][0],dp[i][j][k-1][1]);
                    for(int t=0;t<i;t++) if(a[t]>c[k-1]) cnt++;
                    for(int t=0;t<j;t++) if(b[t]>c[k-1]) cnt++;
                    dp[i][j][k][0]=min(dp[i][j][k][0],cnt);
                }
            }
        }
    }
    cout<<min(dp[sa][sb][sc][0],dp[sa][sb][sc][1])<<le;
    return 0;
}

标签:std,cnt,const,int,Company,cf771D,Bear,++,dp
From: https://www.cnblogs.com/touchfishman/p/17071450.html

相关文章

  • ios ipa apple company 开发者账号申请分享攻略
    ios公司开发者账号申请分享攻略好不容易终于申请下来了ios公司开发者账号,真是一路艰辛和漫长啊,特别是对于远在大洋彼岸的大中华国家。以下我就分享一下这一路下来的经验,希......
  • 基于 JWT Bearer 的身份认证方案
    基于JWTBearer的身份认证方案认证流程匿名访问资源,server响应401client跳转至登录页面client请求RSA公钥,用户输入账号、密码client对密码执行RSA加密,请......
  • asp.net core api 基于token的JWT bearer 的鉴权验证实现探索
    .net的各种框架啥的都不是很熟悉,当时只是想怎么实现快速校验授权确保api是通过验证之后才能打开。我说的快速就是不需要写重复的样板代码,通过总体控制,最后发现,似乎也只能通......
  • 接口认证方式:Bearer Token
    因为HTTP协议是开放的,可以任人调用。所以,如果接口不希望被随意调用,就需要做访问权限的控制,认证是好的用户,才允许调用API。此文介绍下目前主流的访问权限控制/认证模......
  • A. Bear and Prime 100 (交互)
    A.BearandPrime100题意:有一个范围为[2,100]的数x,让你提问不超过20次这,每次提问你可以给bot一个整数,如果整数是x的因子,则返回yes,否则返回no,问这个数是不是质数。......
  • 【FFH】Bearpi-HM-Micro开机自启动程序
    (目录)1.前言项目开发需要联网传输数据,每次开机都要事先运行WiFi程序。于是想办法能不能板子开机的时候就能自动启动运行WiFi程序,不需要每次都命令行输入。2.开发例程2.......
  • dropbear 2019.78 Installing to target......Running build_buildroot failed!
     使能buildroot的环境变量sourceenvsetup.sh;rv1126一般选择90make dropbear-dircleanmake dropbear./build.sh rootfs./build.sh再不行的话,可以多试两次,再不......
  • #冲刺创作新星#【FFH】Bearpi-Micro深入解析通过JS应用控制LED灯
    (目录)一、前言最近跑了一遍Bearpi-Micro编写点亮LED灯程序的Demo,深入了解了如何在开发板上运行一个控制LED灯的程序,达到能关闭灯、开启灯以及翻转灯的状态,南向如何编写JS......
  • Intercompany 流程创建My PBD
    projectIntercompany流程是一个集团下面有两个子公司。子公司A接到客户项目customerproject,创建customerproject.子公司B提供resource给子公司A,所以子公司B需......
  • 公司名/机构名语料库(Company-Names-Corpus)
    向AI转型的程序员都关注了这个号????????????机器学习AI算法工程  公众号:datayx公司名语料库(Company-Names-Corpus)数据大小:480万。语料来源:多个词典汇总。数据清洗:已清洗......