慢慢有感觉了,不过这题还是看了一下题解,情况没考虑清楚。。。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<queue>
#define INF 2000000000
int dp[2005][2005],n,m,add[27],del[27];
char s[2005],ap[27];
int min(int a,int b)
{
return a>b?b:a;
}
int dfs(int le,int ri)
{
//printf("*%d %d %d\n",le,ri,dp[le][ri]);
int i,j,k,l;
if(dp[le][ri]!=-1)
return dp[le][ri];
if(le>=ri)
return 0;
dp[le][ri]=min(dfs(le+1,ri)+add[s[le]-'a'],min(dfs(le,ri-1)+add[s[ri]-'a'],min(dfs(le+1,ri)+del[s[le]-'a'],dfs(le,ri-1)+del[s[ri]-'a'])));
if(s[le]==s[ri])
dp[le][ri]=min(dp[le][ri],dfs(le+1,ri-1));
return dp[le][ri];
}
int main()
{
int i,j,k,l;
while(scanf("%d%d",&n,&m)!=EOF)
{
scanf("%s",&s);
for(i=1;i<=n;i++)
{
getchar();
scanf("%c",&ap[i]);
scanf("%d%d",&add[ap[i]-'a'],&del[ap[i]-'a']);
}
memset(dp,-1,sizeof(dp));
dfs(0,m-1);
printf("%d\n",dp[0][m-1]);
// for(i=0;i<m;i++)
// for(j=0;j<m;j++)
// printf("%d %d %d\n",i,j,dp[i][j]);
}
return 0;
}