首页 > 其他分享 >洛谷P7767 DNA 题解

洛谷P7767 DNA 题解

时间:2024-08-13 22:08:33浏览次数:13  
标签:P7767 ch DNA min int 题解 dp 位为

Problem

Solution

考虑 DP。

设 \(dp_{i,0}\) 表示前 \(i\) 个字符全为 A 的最小操作次数,\(dp_{i,1}\) 表示前 \(i\) 个数全为 B 的最小操作次数。

考虑转移。

若当前位为 A 则 \(dp_{i,0}=\min(dp_{i-1,0},dp_{i-1,1}+1)\),\(dp_{i,1}=\min(dp_{i-1,0}+1,dp_{i-1,1}+1)\);

若当前位为 B 时同理。

最后输出 \(\min(dp_{n,0},dp_{n,1}+1)\) 即可。

Code

#include<bits/stdc++.h>
using namespace std;
#define For(i,a,b) for(int i=(a);i<=(b);i++)
#define FOR(i,a,b) for(int i=(a);i>=(b);i--)
namespace IO
{
	inline int read()
	{
		register int x=0,f=0;register char ch=getchar();
		while(ch<'0' || ch>'9')f|=ch=='-',ch=getchar();
		while(ch>='0' && ch<='9')x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
		return f?-x:x;
	}
	int min(int x,int y){return x<y?x:y;}
}
using namespace IO;

const int N=1e6+4;
int n,dp[N][2];
string S;
int main()
{
	cin>>n>>S;
	S=" "+S;
	// dp[i][0] i,A
	// dp[i][1] i,B
	memset(dp,0x3ffffff,sizeof(dp));
	if(S[1]=='A')dp[1][0]=0,dp[1][1]=1;
		else dp[1][0]=1,dp[1][1]=0;
	For(i,2,n)
		if(S[i]=='A')dp[i][0]=min(dp[i-1][0],dp[i-1][1]+1),dp[i][1]=min(dp[i-1][0]+1,dp[i-1][1]+1);
			else dp[i][0]=min(dp[i-1][0]+1,dp[i-1][1]+1),dp[i][1]=min(dp[i-1][0]+1,dp[i-1][1]);
	cout<<min(dp[n][0],dp[n][1]+1);

	return 0;
}

标签:P7767,ch,DNA,min,int,题解,dp,位为
From: https://www.cnblogs.com/Wu-ZH/p/18357786

相关文章

  • 洛谷P9539 「AWOI Round 2 B」树学 题解
    ProblemSolution题目要求字典序最小,所以一定要尽可能多的\(a\),而且要尽可能靠前。所以我们只需修改不是\(a\)的位置为\(a\)即可。但若\(a\)的个数比\(r\)大,我们就需要将多余的\(a\)手动改为\(b\)并在接下来的修改中保持不变,所以定义一个\(vis_i\)表示是否一定......
  • 洛谷P9541 「AWOI Round 2 D」数字三角形 题解
    ProblemSolution通过题目意思发现,有三种情况:没有旋转的初始情况旋转一次的情况旋转两次的情况我们考虑怎么处理初始情况,其他情况同理。首先,我们发现经过数和最大一定可以保证是每行的最大值的总和,所以只要计算最小的消耗就可以了。考虑DP,设\(dp_{i,j}\)表示从......
  • CF895B XK Segments 题解 二分
    题目链接:https://codeforces.com/problemset/problem/895/B题目大意给你一个长度为\(n\)的数列\(a_1,a_2,\ldots,a_n\)。求数列中存在多少个不同的下标对\((i,j)\)满足如下条件:\(a_i\lea_j\)并且恰好有\(k\)个整数\(y\)满足\(a_i\ley\lea_j\)且\(y\)......
  • 题解:CF1957A Stickogon
    原地址:这里思路首先看样例41121162233339422224244首先可以肯定当\(t\)为\(1\)和\(2\)时不能组成多边形,易知要组成最多的多边形,三角形更有性价比,观察样例\(t\)为\(6\)可以发现,只要用相同的木棍除以\(3\)取整便是答案,可能会有人问了,那我用......
  • 题解:AT_abc352_c [ABC352C] Standing On The Shoulders
    原地址:这里大意几个吃饱了撑的巨人在玩叠罗汉,每个人踩在前一个人的肩膀上,求这个叠罗汉最高有多高。思路直接先求出所有巨人的肩高之和,然后再一个一个枚举看加上哪一个巨人的头高最大就行了。代码#include<iostream>usingnamespacestd;inta[200005],b[200005];intmain......
  • 题解:CF1971B Different String
    原地址:这里题意给出字符串\(s\),询问更改\(s\)的排列顺序后与原来的\(s\)是否不同,不同输出YES,否则输出NO。思路只要判断字符串中含有不同的字符即可。代码#include<iostream>#include<cstdio>usingnamespacestd;intmain(){ intt; scanf("%d",&t); while(t-......
  • 【题解】 [NOIP 2002 普及组] 产生数
    题目描述题目大意给定\(k\)个规则,规则为“使一位数可变换成另一个一位数”。求整数\(n\)根据规则经过若干次(可以为0次或多次)变化,能生成的整数个数。思路该题主要考察:Floyd传递闭包,高精度乘法。显而易见,规则具有传递性。举个例子,1可变换成2,2可变换成3,则1可变换成3。当然......
  • P8997 题解
    P8997思路按题意模拟,用栈建出二叉树,叶子节点是要填的值,非叶子是运算符。判断一个叶子能贡献能填哪些数并最终成为答案,即dp计算要使该叶子的值\(ans\)成为答案最少要填\(num0\)个\(<=ans\)和\(num1\)个\(>ans\)的数。发现dp只与\(\leans\)和\(>ans\)的数的个......
  • P8996 题解
    P8996思路当有\(a_i<a_j\)时,先放\(a_i\),再放\(i\)之后连续的\(a_k<a_i\)。设\(i\)后第一个比\(a_i\)大的位置是\(nxt_i\),对于一个前缀最大值位置\(i\),合并后\([i,nxt_i)\)的顺序不变且依然连续。让前缀最大值\(a_l\)代表整个区间,可以看做合并是将两个序列的前缀......
  • arc182c 题解
    arc182c思路有\(6\)个小于\(14\)的质数,设这\(6\)个质数的指数分别为\(x_1,\dotsb,x_6\)。\(ans=\sum(\prod_{i=1}^d(x_i+1))\)。状压这\(6\)个数,维护\(val_s=\prod_{i=1}^6(x_i\times[s二进制第i位为1]+[s二进制第i位为0])\)。当加入一个数时,某些\(x_i\)会加......