POJ3280题解(视频讲解区间dp)

视频讲解:

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;
}

猜你喜欢

转载自blog.csdn.net/stn54999/article/details/113603731