[codeforces 1385D] a-Good String 每次都面临两种选择(练习递归的好题)

Codeforces Round #656 (Div. 3)   参与排名人数11542   早睡早起身体好

[codeforces 1385D]   a-Good String   每次都面临两种选择(练习递归的好题)

总目录详见https://blog.csdn.net/mrcrack/article/details/103564004

在线测评地址https://codeforces.com/contest/1385/problem/D

Problem Lang Verdict Time Memory
D - a-Good String GNU C++17 Accepted 31 ms 4000 KB

题目大意:用递归方式构造字符串。在给出字符串的基础上,问要构造符合题意的字符串,需要改变的最小字母个数。

基本思路:每次都面临两种选择(练习递归的好题)

有递归的基础,直接看代码,应该能看懂。

AC代码如下:

#include 
#include 
#define maxn 140000
using namespace std;
char s[maxn];
int dfs(int l,int r,char c){
	int cnt1=0,cnt2=0,mid,i;
	if(l==r)return s[l]!=c;//只剩一个字母
	mid=(l+r)/2;
	for(i=l;i<=mid;i++)cnt1+=s[i]!=c;//一种选择
	for(i=mid+1;i<=r;i++)cnt2+=s[i]!=c;//另一种选择
	return min(cnt1+dfs(mid+1,r,c+1),cnt2+dfs(l,mid,c+1));//两种选择进行比较
}
int main(){
	int t,n;
	scanf("%d",&t);
	while(t--){
		scanf("%d",&n);
		scanf("%s",s+1);
		printf("%d\n",dfs(1,n,'a'));
	}
	return 0;
}

类似题目:

[codeforces 1353D] Constructing the Array 分治算法

你可能感兴趣的:(codeforces)