注意初始化的问题。
----------------------
#include <iostream> #include <cstdio> #include <cstring> #include <vector> using namespace std; const int OO=1e9; int f[111][1111][33]; int a[33][33]; char s[1111]; bool v[111][1111][33]; int k; int main() { int n; char x,y; int c; memset(a,0,sizeof(a)); memset(f,0,sizeof(f)); memset(v,0,sizeof(v)); cin>>(s+1)>>k; cin>>n; for (int i=1; i<=n; i++) { cin>>x>>y>>c; a[x-'a'][y-'a']=c; } int len=strlen(s+1); for (int i=0;i<=len;i++) { for (int j=0;j<26;j++) { for (int l=0;l<=k;l++) { f[l][i][j]=-OO; } } } for (int i=0;i<26;i++) { if (s[1]-'a'==i) { f[0][1][i]=0; } else { f[1][1][i]=0; } } for (int i=2; i<=len; i++) { for (int j=0; j<26; j++) { if (j==s[i]-'a') { for (int l=0; l<=k; l++) for (int t=0; t<26; t++) { f[l][i][j]=max( f[l][i][j], f[l][i-1][t]+a[t][j] ); } } else { for (int l=1; l<=k; l++) for (int t=0; t<26; t++) { f[l][i][j]=max( f[l][i][j], f[l-1][i-1][t]+a[t][j] ); } } } } int ans=-OO; for (int l=0; l<=k; l++) { for (int j=0; j<26; j++) { if (f[l][len][j]>ans) ans=f[l][len][j]; } } cout<<ans<<endl; return 0; }