列表

详情


NC221793. dd爱捣乱

描述

一个完美串应该满足该串中任意长度的子串都不是回文串,把一个字符从变成的代价是,(码差值),问把一个串变成完美串的最小代价
保证串中只出现小写英文字母

输入描述

第一行一个数n(2≤n≤1000000),表示串的长度
第二行给出一个长度为n的字符串,保证串中只出现小写英文字母

输出描述

表示最小代价

示例1

输入:

5
zoxgd

输出:

0

示例2

输入:

5
ddbdf

输出:

1

说明:

改成dcbdf

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 314ms, 内存消耗: 99268K, 提交时间: 2021-05-28 22:50:45

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int n,dp[N][5][5],res=1e9; char str[N];
inline char get(char a,int x){return ((a-'a'+(x>=3?x-5:x))+26)%26+'a';}
inline int val(int x){return x>=3?5-x:x;}
signed main(){
	scanf("%d %s",&n,str+1);
	memset(dp,0x3f,sizeof dp);
	for(int i=0;i<5;i++) for(int j=0;j<5;j++) dp[1][i][j]=val(j);
	for(int i=2;i<=n;i++)
		for(int j=0;j<=4;j++)
			for(int k=0;k<=4;k++)
				for(int s=0;s<=4;s++){
					char c0=get(str[i],j),c1=get(str[i-1],k),c2=get(str[i-2],s);
					if(c0!=c1&&c0!=c2&&c1!=c2)	dp[i][k][j]=min(dp[i][k][j],dp[i-1][s][k]+val(j));
				}
	for(int i=0;i<=4;i++) for(int j=0;j<=4;j++)	res=min(res,dp[n][j][i]);
	cout<<res;
	return 0;
}

上一题