首页 > 其他分享 >♿交换序列题解♿

♿交换序列题解♿

时间:2024-10-25 15:12:08浏览次数:7  
标签:loc int 题解 sum 交换 32 序列 dp

以下将状态 \(K\),\(E\),\(Y\) 用数字0,1,2表示。

考虑 \(dp\)

我们设 \(dp[a][b][c][d]\) 表示 \(K\) 用了 \(a\) 次,\(E\) 用了 \(b\) 次,\(Y\) 用了 \(c\) 次,总共交换了 \(d\) 次,

前缀和 $sum[i][j] $表示到第 \(j\) 位有几个字母 \(i\)
记录一个 \(loc[i][j]\)表示第 \(j\) 个字母 \(i\) 在哪里

image

那么对于 \(dp[a][b][c][d]\),以再选一个 \(a\) 为例,转移应为:

\[dp[a+1][b][c][d+max(0,sum[1][loc[0][a+1]+1]-b) max(0,sum[2][loc[0][a+1]+1]-c)]\\+=dp[a][b][c][d] \]

ACcode

#include<bits/stdc艹.h>
using namespace std;
#define int long long
char s[40];
int n,num[3],sum[3][32],loc[3][32],dp[32][32][32][910],ans=0,O=0;
signed main(){
	cin>>s+1>>n;
	int len=strlen(s+1);
	for(int i=1;i<=len;i++){
		int m;
		if(s[i]=='K'){
			m=0;
		}
		else if(s[i]=='E'){
			m=1;
		}
		else{
			m=2;
		}
		sum[0][i]+=sum[0][i-1];
		sum[1][i]+=sum[1][i-1];
		sum[2][i]+=sum[2][i-1];
		sum[m][i]++;
		num[m]++;
		loc[m][num[m]]=i;
	}
	dp[0][0][0][0]=1;
	for(int k=0;k<=num[0];k++){
		for(int e=0;e<=num[1];e++){
			for(int y=0;y<=num[2];y++){
				for(int step=0;step<=n&&step<=900;step++){
					dp[k+1][e][y][step+max(O,sum[1][loc[0][k+1]]-e)+max(O,sum[2][loc[0][k+1]]-y)]+=dp[k][e][y][step];
					dp[k][e+1][y][step+max(O,sum[0][loc[1][e+1]]-k)+max(O,sum[2][loc[1][e+1]]-y)]+=dp[k][e][y][step];
					dp[k][e][y+1][step+max(O,sum[0][loc[2][y+1]]-k)+max(O,sum[1][loc[2][y+1]]-e)]+=dp[k][e][y][step];
				}
			}
		}
	}
	for(int step=0;step<=n&&step<=900;step++){
		ans+=dp[num[0]][num[1]][num[2]][step];
	}
	cout<<ans<<endl;
	return 0;
}

标签:loc,int,题解,sum,交换,32,序列,dp
From: https://www.cnblogs.com/lewisak/p/18502585

相关文章

  • 序列题解
    哈哈哈我也有个唐氏做法也是考虑一个朴素dp,设\(dp_{i}\)表示以\(i\)结尾的字串最长是多少,则容易想到若\(a_{i-1}\)和\(a_i\)是等比数列的一部分就一定能从\(dp_{i-1}\)转移到\(dp_i\),证明最后讲那么如何判断\(a_{i-1}\)和\(a_i\)是否为等比数列的一部分呢?首先......
  • 最长的Y题解
    考虑将Y单独拎出来,用数组存储他的下标,那么将第\(x\)个Y转移至第\(y\)个Y就需要\(a[x]-b[y]-1\)次操作。发现一个问题:第一次从左移动至\(y\)需要减1,第二次从左移动需要减2……如图:这似乎是一个很麻烦的问题,我们的某知名\(lyh\)教授是通过指针(应该是吧)解决的。......
  • 家谱树题解
    (ACM比赛时忘了拓扑怎么写时代尻古)假设有一个DAG图,那么如何写出它的拓扑排序呢?这里说一种比较常用的方法:1.从DAG图中选择一个没有前驱(即入度为0)的顶点并输出。2.从图中删除该顶点和所有以它为起点的有向边。3.重复1和2直到当前的DAG图为空或当前图中不存在无前驱的......
  • SSL证书常见问题解答
    在当今的数字时代,确保网站和数据的安全性变得尤为重要。SSL(SecureSocketsLayer)证书作为保障网站安全的关键组件,广泛应用于各种在线服务中。然而,在SSL证书的申请、安装和使用过程中,用户常常会遇到各种问题。本文旨在提供一个全面的指南,帮助用户理解并解决SSL证书的常见问题。......
  • 题解:CF722D Generating Sets
    涉及知识点:set。解题思路每次让列表中最大的元素缩小两倍,保证答案最优。如果当前的元素缩小成$0$就直接跳出循环,输出这个序列。由于序列需要支持插入、删除以及找最大值,所以这个序列可以用set来维护。代码#include<bits/stdc++.h>#defineintlonglong#definell......
  • 题解:P10298 [CCC 2024 S4] Painting Roads
    涉及知识点:图的遍历。我们观察样例可以发现,染色之后的图是一颗树,而且还是dfs树。题目要求所以路径上的颜色都是交替的,所以直接交替染色即可。注意:建图的时候需要记录当前边的编号。代码#include<bits/stdc++.h>#defineintlonglong#definell__int128#definedbd......
  • 题解:SP25334 NPC2015A - Eefun Guessing Words
    涉及知识点:字符串处理。解题思路记录每个字符出现的第$1$个位置和最后$1$个位置,询问时比较大小即可。代码#include<bits/stdc++.h>//#defineintlonglong#definell__int128#definedbdouble#defineldblongdouble#definevovoid#defineendl'\n'#defin......
  • 题解:CF1988B Make Majority
    题目大意题面写得很清楚,我就不再赘述了。解题思路涉及知识点:字符串,构造。由于所有相邻的$0$合并完会变成一个$0$,所以先贪心地把所有挨在一起的$0$合并起来,放在一个新的字符串里。而且题目需要你判断是否最终是否能合并成一个$1$,所以$1$是不需要想$0$一样合并的,这......
  • 题解:CF1994B Fun Game
    涉及知识点:异或,字符串处理。解题思路‌异或是一种二进制运算,用于比较两个数字的差异。当两个输入不同时,异或运算的结果为1;当两个输入相同时,结果为0。现在就可以切掉本题了。设两个字符串分别为$a$,$b$。如果$a$和$b$完全相同,输出Yes。如果$a$中没有$1$且$b$......
  • 题解:CF633D Fibonacci-ish
    涉及知识点:枚举,STL。题目大意给你一个序列,让你选出一些元素,使其构成fibonacccccci数列,求数列的最大长度。解题思路定义一个桶,$mp_i$代表$i$这个数在输入序列当中出现的次数。由于$n\le1000$,所以可以直接暴力枚举fibonacccccci数列的前两个数。前两个数固定了,这......