POJ3280題解(視訊講解區間dp)
阿新 • • 發佈:2021-02-04
視訊講解:
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;
}