比赛地址: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;
}
京公网安备 11010502036488号