设dpi,j为前i个字符相邻字符不相同且第i个字符操作j次的最小次数 每一个字符串最多变化26次,在多的话就是浪费操作次数了遍历到i,j的时候去匹配前1个字符的变化的k次情况取最小值即可 dp方程
#include <bits/stdc++.h>
using namespace std;
#define N 100005
#define int long long
int mx=INT_MAX;
int dp[N][30];//dpij表示第i个字母变成操作j次后变成合法性次数
int a[N];
int check(int x1,int w1,int x2,int w2){
	return ((x1+w1)%26)!=((x2+w2)%26);
}
signed main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	int n;
	cin>>n;
	string s;
	cin>>s;
	char c='z'+1;
	s=' '+s;
	for(int i=1;i<=n;i++){
		a[i]=s[i]-'a';		
	}
	for(int i=0;i<=26;i++){
		dp[0][i]=i;
	}
	for(int i=1;i<=n;i++){
		for(int j=0;j<=26;j++){
			dp[i][j]=mx;
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=0;j<=26;j++){
			for(int k=0;k<=26;k++){
				if(check(a[i-1],k,a[i],j)||i==1){
					dp[i][j]=min(dp[i][j],dp[i-1][k]+j);
				}
			}
		}
	}
	int ans=mx;
	for(int i=0;i<=26;i++){
		ans=min(ans,dp[n][i]);
	}
	cout<<ans<<'\n';
	return 0;
}
        小红有一个长度为n的字符串S,现在他可以执行以下的操作:
选择一个索引i(1≤i≤n),并将Si按照字母表上的顺序、循环右移一位。例如:‘a’右移一位为‘b’,‘z’右移一位为‘a’。
小红想知道使得字符串S任意两个相邻的字符都不一致的最小操作次数为多少。
第一行输入一个整数 n(2≤n≤105)代表字符串的长度。
第二行输入一个长度为n,且只包含小写字母的字符串S。
在一行输出n个整数,代表使得任意两个相邻的字符都不一致的最小操作次数。
输入
3
aaa
输出
1
说明
只需要将第二个‘a’右移一位即可。
输入
2
ab
输出
0