思路:
- dp
- 我们枚举每一位变成每一种字符(26种)时的花费(保证此时字符串递增)。
值得注意的是当我们计算花费时需要取得当前位最小值,就必须要去遍历前面状态小于自己字符的花费取最小,这个问题可以通过加一个额外的记录最小值的变量完成,不过在代码里我们做的更绝:每一位保存的都是全体最小值,其意义为:当前位置取不大于当前字符的字符时的最小花费。这样问题就解决了。
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define intmax 0x7fffffff
#define halfintmax 0x3fffffff
typedef pair<int, int> pii;
typedef pair<int, char> pic;
const int N = 1000006;
const int mod = 1e9 + 7;
int n, dp[N][30];
int main() {
cin >> n;
char c;
int x;
for(int i = 1; i <= n; i ++) dp[i][0] = 0x3fffffff;
for(int i = 1; i <= n; i ++) {
scanf(" %c", &c);
x = c - 'A' + 1;
for(int j = 1; j <= 26; j ++) {
dp[i][j] = abs(x - j) + dp[i - 1][j];
dp[i][j] = min(dp[i][j], dp[i][j - 1]);
}
}
int ans = 0x3fffffff;
for(int i = 1; i <= 26; i ++)
ans = min(ans, dp[n][i]);
cout << ans;
return 0;
}

京公网安备 11010502036488号