比赛地址: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; }