題目鏈接:Cheapest Palindrome G
直接令 dp[i][j] 爲區間 [ i , j ] 的最小代價。
每次如果s[i] = s[j] 就可以直接從 dp[i+1][j-1] 當中轉移。
否則從 dp[i+1][j] 或者 dp[i][j-1] 轉移。
AC代碼:
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int N=2010,inf=0x3f3f3f3f;
int dp[N][N],n,m,add[N],del[N]; char str[N],ch[2];
int solve(int l,int r){
if(l>=r) return 0;
if(dp[l][r]!=inf) return dp[l][r];
if(str[l]==str[r]) dp[l][r]=solve(l+1,r-1);
dp[l][r]=min(dp[l][r],solve(l+1,r)+min(add[str[l]],del[str[l]]));
dp[l][r]=min(dp[l][r],solve(l,r-1)+min(add[str[r]],del[str[r]]));
return dp[l][r];
}
signed main(){
cin>>n>>m; scanf("%s",str+1); memset(dp,0x3f,sizeof dp);
for(int i=1,x,y;i<=n;i++){
scanf("%s %d %d",ch,&x,&y); add[ch[0]]=x,del[ch[0]]=y;
}
cout<<solve(1,m);
return 0;
}