考试一道题题解。


30pts:枚举所有串,\(check\) 是否可行。

60pts:做 \(bfs\),暴力推演变化过程,用 \(map\) 去重,时间复杂度 \(O(nC_{n}^{n/3}C_{n-n/3}^{n/3})\)。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
unordered_map<string,int>mp;
string s;int k;
ll ans=1;
struct zjy{
string s;int b;
};queue<zjy>q;
int main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>s>>k;mp[s]=1;
q.push({s,0});
while(q.size()){
int b=q.front().b+1;
s=q.front().s;q.pop();
if(b>k) continue;
for(int i=1;s[i];i++){
swap(s[i-1],s[i]);
if(!mp[s])
mp[s]=1,q.push({s,b}),ans++;
swap(s[i-1],s[i]);
}
}cout<<ans;
return 0;
}

100pts:

考虑到同种字符相对位置不可能发生改变,所以可以直接一个一个加入字符,然后加上将他移动到这里的代价。

设 \(dp_{i,j,k,l}\) 表示前 \(i+j+k\) 位用了 \(i\) 个 \(K\),\(j\) 个 \(E\),\(k\) 个 \(Y\),转换了 \(l\) 次时的可能性。

转移方程详见代码,时间复杂度 \(O(n^5)\)(\(K\) 超过 \(\frac{sz(sz-1)}{2}\) 就是在走倒退)。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
string s;int k,n,m,y;
int a[35],b[35],c[35];
ll dp[35][35][35][605],ans;
int sm1[35],sm2[35],sm3[35];
int main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>s>>k;int sz=s.size();
k=min(k,sz*(sz-1)/2);
for(int i=0;s[i];i++){
sm1[i+1]=sm1[i];
sm2[i+1]=sm2[i];
sm3[i+1]=sm3[i];
if(s[i]=='K')
a[++n]=i+1,sm1[i+1]++;
if(s[i]=='E')
b[++m]=i+1,sm2[i+1]++;
if(s[i]=='Y')
c[++y]=i+1,sm3[i+1]++;
}dp[0][0][0][0]=1;
for(int i=0;i<=n;i++)
for(int j=0;j<=m;j++)
for(int l=0;l<=y;l++)
for(int t=0;t<=k;t++){
if(i<n){
int p=a[i+1],cnt=max(0,sm2[p]-j)+max(0,sm3[p]-l);
//cnt指将第i+1个K移动到第i+j+l+1位所用的代价,下同
dp[i+1][j][l][t+cnt]+=dp[i][j][l][t];
}if(j<m){
int p=b[j+1],cnt=max(0,sm1[p]-i)+max(0,sm3[p]-l);
dp[i][j+1][l][t+cnt]+=dp[i][j][l][t];
}if(l<y){
int p=c[l+1],cnt=max(0,sm1[p]-i)+max(0,sm2[p]-j);
dp[i][j][l+1][t+cnt]+=dp[i][j][l][t];
}if(i+j+l==sz) ans+=dp[i][j][l][t];
}
cout<<ans;
return 0;
}

[ABC227E] Swap 题解的更多相关文章

  1. CF1082B Vova and Trophies 题解

    CF1082B Vova and Trophies 题解 瞎搞题,推荐的,一看是道水题,就随手A了-- 题目描述 Vova has won \(n\)trophies in different com ...

  2. 算法与数据结构基础 - 贪心(Greedy)

    贪心基础 贪心(Greedy)常用于解决最优问题,以期通过某种策略获得一系列局部最优解.从而求得整体最优解. 贪心从局部最优角度考虑,只适用于具备无后效性的问题,即某个状态以前的过程不影响以后的状态. ...

  3. [LeetCode 题解]:Swap Nodes in Pairs

    前言   [LeetCode 题解]系列传送门:  http://www.cnblogs.com/double-win/category/573499.html   1.题目描述 Given a li ...

  4. leetcode 题解 || Swap Nodes in Pairs 问题

    problem: Given a linked list, swap every two adjacent nodes and return its head. For example, Given ...

  5. [LeetCode]Swap Nodes in Pairs题解

    Swap Nodes in Pairs: Given a linked list, swap every two adjacent nodes and return its head. For exa ...

  6. 题解 SP27102/UVA1747 【Swap Space】

    SP27102 [Swap Space] 双倍经验:UVA1747 Swap Space 用(a,b)表示每个硬盘的原容量和新文件系统下的容量.分两种情况考虑:a≤b和a>b 第一类a≤b格式化 ...

  7. Swap Nodes in Pairs LeetCode题解

    做完这个题目,感觉LeetCode的题目出的真好... 这种题,如果让我在面试时候纸上写代码,肯定会挂的. 我昨天晚上看的题目,昨天脑子是懵的,放下了.今天早上来做. 一开始做,提交,果然错了.写的代 ...

  8. LeetCode题解之Swap Nodes in Pairs

    1.题目描述 2.问题分析 对两个节点进行交换操作 3.代码 ListNode* swapPairs(ListNode* head) { if( !head || head->next == N ...

  9. PAT甲题题解-1067. Sort with Swap(0,*) (25)-贪心算法

    贪心算法 次数最少的方法,即:1.每次都将0与应该放置在0位置的数字交换即可.2.如果0处在自己位置上,那么随便与一个不处在自己位置上的数交换,重复上一步即可.拿样例举例:   0 1 2 3 4 5 ...

  10. leetcode个人题解——#24 Swap Nodes in Pairs

    因为不太熟悉链表操作,所以解决方法烦了点,空间时间多有冗余. 代码中l,r分别是每一组的需要交换的左右指针,temp是下一组的头指针,用于交换后链接:res是交换后的l指针,用于本组交换后尾指针在下一 ...

随机推荐

  1. Javascript 常用封装(一)

    1.获取URL的query参数 作用:根据传入的属性名输出对应的值,没有则输出null 注意:url传参中包含中文时,默认的获取结果会乱码,需要进行解码 //解析query传参 url参数中含有中文时 ...

  2. 盘点一下在swagger中一些有用且经常忽略的属性

    震惊!,这些Swagger的属性你都了解吗? 盘点一下在swagger中一些有用且经常忽略的属性 启用永久授权EnablePersistAuthorization app.UseSwaggerUI(c ...

  3. 10C++选择结构(4)

    一.switch语句 问题:风之巅小学规定,若测试成绩大于或等于90分为"A",大于或等于70分小于90分为"B",大于或等于60分小于70分为"C& ...

  4. 中电金信:基于AI的智能化国内信用证结算系统

    ​ 2023年<商业银行资本管理办法>正式稿中,明确规定了国内信用证的信用转换系数:与贸易直接相关的短期或有项目,其信用转换系数为20%:而基于服务贸易的国内信用证,其系数为50%. 这一 ...

  5. 《刚刚问世》系列初窥篇-Java+Playwright自动化测试-8- 元素高级定位技巧(详细教程)

    1.简介 随着网页的复杂性和动态性的增加,自动化测试变得越来越重要.Playwright作为一款强大的无头浏览器测试库,提供了多种元素定位方式,使得我们能够轻松地对网页进行自动化操作.在基础的定位方式 ...

  6. web应用模式、API接口、接口测试工具postman、restful规范

    目录 一.web 应用模式 二.API接口 API概念 三.接口测试工具postman postman介绍 postman下载与使用 四.如何在浏览器中测试 五.restful规范(重要,不难) 概念 ...

  7. 【C#】【平时作业】习题-8-异常处理

    目录 一.概念题 什么是异常处理? 异常处理的语法结构是什么? finally块有何作用? throw语句有何作用? 二.程序设计 一.概念题 什么是异常处理? 异常是在程序执行期间出现的问题.C# ...

  8. java - 正则表达式替换Spring @RequestMapping URL中的@PathVariable值

    我在接口(只是为了保存常量)中有Spring MVC URL的定义,例如: String URL_X = "/my-url/{id:[0-9]*}"; String URL_Y = ...

  9. 基于Three.js的大屏3D地图(一)

    依赖安装 yarn add three yarn add @types/three yarn add d3-geo three库安装后在node_modules下其还包含核心three/src和插件t ...

  10. Qt/C++编写手机版本视频播放器和Onvif工具(可云台和录像)

    一.前言 用Qt+ffmpeg写播放器很多人有疑问,为何不用Qt自己的多媒体框架来写,最重要的原因是Qt自带的目前都依赖具体的本地解码器,如果解码器不支持,那就是歇菜的,最多支持个MP4格式,而且在手 ...