比赛地址:https://ac.nowcoder.com/acm/contest/11211

A:
把 A~Z 的个字母,对应,利用动态规划的解法,设表示前位,最后一位为的最小修改次数,转移方程就为:,因为题目要求的是非递减序列,所以就是前位中,结尾字母比小的字母的最小值,注意,如果等于字符串本身的字符,则不需要

#include<bits/stdc++.h>
using namespace std;
string s;
int a[27];
int main()
{
    int n;
    cin>>n;
    cin>>s;
    for(int i=0;i<n;i++)
    {
        int x=1e7;
        for(int j=1;j<=26;j++)
        {
            x=min(x,a[j]);
            a[j]=x+1;
        }
        a[s[i]-'A'+1]--;
    }
    int ans=1e7;
    for(int i=1;i<=26;i++)
    {
        ans=min(ans,a[i]);
    }
    cout<<ans<<endl;
    return 0;
}

C
C题与A题就只有修改代价的不同,只需状态转移改变一下即可

#include<bits/stdc++.h>
using namespace std;
string s;
int a[27];
int main()
{
    int n;
    cin>>n;
    cin>>s;
    for(int i=0;i<n;i++)
    {
        int x=1e9;
        for(int j=1;j<=26;j++)
        {
            x=min(x,a[j]);
            a[j]=x+abs(j-(s[i]-'A'+1));
        }
    }
    int ans=1e9;
    for(int i=1;i<=26;i++)
    {
        ans=min(ans,a[i]);
    }
    cout<<ans<<endl;
    return 0;
}