思路:

$dp_{i,j,c}$ 它表示在前 $i$ 个字符中使用了 $j$ 次更改操作。

并且最后一个字符是 $c$ 的情况下所能达到的最大美丽度。

状态转移方程:

如果 $m=s[i-1]- \texttt a $:$ dp_{i,j,m}=\max{dp_{i,j,m},dp_{i-1,j,q}+c_{q,m}}$

如果 $m \ne s[i-1]-\texttt a$:$dp_{i,j,m}=\max{dp_{i,j,m},dp_{i-1,j-1,q}+c_{q,m}}$。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include<bits/stdc++.h>
#define int long long
using namespace std;
int c[26][26],dp[105][105][26],k,n,p,ans=INT_MIN;
string s;
char x,y;
signed main() {
cin>>s>>k>>n;
for(int i=1;i<=n;i++){
cin>>x>>y>>p;
c[x-'a'][y-'a']=p;
}
for(int i=1;i<=s.size();i++)
for(int m=0;m<26;m++) dp[i][0][m]=-1e9;
dp[1][0][s[0]-'a']=0;
for(int i=2;i<=s.size();i++)
for(int j=0;j<=k;j++)
for(int m=0;m<26;m++)
if(m==s[i-1]-'a')
for(int q=0;q<26;q++) dp[i][j][m]=max(dp[i][j][m],dp[i-1][j][q]+c[q][m]);
else if(j)
for(int q=0;q<26;q++) dp[i][j][m]=max(dp[i][j][m],dp[i-1][j-1][q]+c[q][m]);
for(int m=0;m<26;m++) ans=max(ans,dp[s.size()][k][m]);
cout<<ans<<endl;
return 0;
}