视频讲解:
POJ3280题目理解
非常抱歉:因中途录制原因只录制了主要部分,下面进行补充。
- 如果str[i]==str[j],dp[i][j]=dp[i+1][j-1]
- 如果不相等,dp[i][j]=min(dp[i][j],dp[i+1][j]+cost[str[
i]-‘a’],dp[i][j-1]+cost[str[j]-‘a’])
- 至于循环为什么i是从0-m,j是i-m的问题,我们观察dp状态转移方程比较容易理解,我们要保证比自己小的区间都要确定完毕。
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
int cost[26]={0};
int dp[2001][2001];
int min1(int a,int b,int c)
{
a=a>b?b:a;
a=a>c?c:a;
return a;
}
int main()
{
int n,m;
string str;
cin>>n>>m;
cin>>str;
for(int i=0;i<n;i++)
{
char ch;
cin>>ch;
int temp1,temp2;
cin>>temp1>>temp2;
cost[ch-'a']=min(temp1,temp2);
}
for(int i=m-1;i>=0;i--)
{
for(int j=i+1;j<m;j++)
{
dp[i][j]=1e8;
if(str[i]==str[j])
{
dp[i][j]=dp[i+1][j-1];
}
else{
dp[i][j]=min1(dp[i][j],dp[i][j-1]+cost[str[j]-'a'],dp[i+1][j]+cost[str[i]-'a']);
}
}
}
cout<<dp[0][m-1];
return 0;
}