1. 程式人生 > 其它 >POJ3280題解(視訊講解區間dp)

POJ3280題解(視訊講解區間dp)

技術標籤:POJdp演算法

視訊講解:

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