区间dp的题,遍历的时候如果有相等的情况,直接赋值后以当前为中心继续往下找,dp[i][j]=dp[i+1][j-1]
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int INF=0x3f3f3f3f;
char s[2000];
int dp[3000][3000];
int num[300];
int main()
{
int n;
int m;
cin>>n>>m;
cin>>s;
char c;
int a,b;
for(int i=0;i<n;i++)
{
cin>>c>>a>>b;
num[c]=min(a,b);
}
memset(dp,0,sizeof(dp));
for(int i=m-1;i>=0;i--)
{
for(int j=i+1;j<m;j++)
{
dp[i][j]=INF;
if(s[i]==s[j])
dp[i][j]=dp[i+1][j-1];
else
{
dp[i][j]=min(dp[i+1][j]+num[s[i]],dp[i][j]);
dp[i][j]=min(dp[i][j-1]+num[s[j]],dp[i][j]);
}
}
}
cout<<dp[0][m-1]<<endl;
return 0;
}