考试一道题题解。


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. Echrtas 实时渲染

    1.实时曲线图 业务场景:每个时间节点产生一个数据,且时间节点间隔不固定 坐标轴配置:X轴类型设定为time,Y轴类型设定为value 数据格式:每个节点的数据都是一个数组,第一个数组为时间,第二个元 ...

  2. S2P医药营销智能管理平台特点和优势

    S2P医药营销智能管理平台是正也科技打造的一个专为医药行业设计的综合性营销解决方案,旨在通过智能化.数据驱动的方式提升医药企业的营销效率和效果.以下是关于S2P医药营销智能管理平台的一些主要特点和优势 ...

  3. 零基础学习人工智能—Python—Pytorch学习(十一)

    前言 本文主要介绍tensorboard的使用. tensorboard是一个可视化的,支持人工智能学习的一个工具. tensorboard的官方地址:https://www.tensorflow.o ...

  4. Qt No Target Architecture

    在QT中引入processthreadsapi.h,如果出现 "No Target Architecture",需要在processthreadsapi.h前引入windows.h ...

  5. API开发与管理规范v1.0

    1. 协议规范 为了确保不同业务系统之间以及前后端的的数据交互的快捷性,通讯协议统一约定如下: 对内调用的API接口统一使用 HTTP协议 对外互联网发布的API建议使用HTTPS协议也可以使用HTT ...

  6. Shiro简单入门+个人理解(3)

    最后一天,对shiro框架的应用也到此为至了,可能不是太全,但相对于一般的项目,它的作用已经使用了很多了 Shiro的授权: 授权:对用户资源访问的授权(是否允许用户访问此资源) 用户访问系统资源时的 ...

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

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

  8. 使用 .NET Core 实现一个自定义日志记录器

    目录 引言 1. 抽象包 1.1 定义日志记录接口 1.2 定义日志记录抽象类 1.3 表结构迁移 2. EntityFramework Core 的实现 2.1 数据库上下文 2.2 实现日志写入 ...

  9. Qt边推流边录制/实时性好延迟低/16路1080P推流加录制只占1%CPU/优化到极致

    一.前言 这个一边推流一边录制的功能,有很多用户提到过,之前因为时间的原因,一直没有搞,年初的时候索性抽空搞了下,也着实费了些功夫.推流用的是ffmpeg这个开源的牛逼的第三方库,搞音视频开发的人应该 ...

  10. Qt自定义控件大全文章导航

    文章 链接 Qt编写自定义控件1-汽车仪表盘 https://qtchina.blog.csdn.net/article/details/89407746 Qt编写自定义控件2-进度条标尺 https ...