poj3280Cheapest Palindrome(记忆化)
真的1A了。。
一开始想复杂了 想着补全再删 没想好 后来想到递归 大的回文串是由小的推过来的
一直递归下去 对于当前的i,j可以选择保留或者删除 选个最小的
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include<cstring> 3 #include<algorithm> 4 #include<stdlib.h> 5 #include<cstdio> 6 using namespace std; 7 #define N 2010 8 #define INF 0xfffffff 9 int v[500][2]; 10 int dp[N][N]; 11 char s[N]; 12 int dfs(int i,int j) 13 { 14 if(i>j) return 0; 15 if(i==j) 16 return dp[i][j]=0; 17 if(dp[i][j]!=-1) 18 return dp[i][j]; 19 if(s[i]==s[j]) 20 dp[i][j] = dfs(i+1,j-1); 21 else 22 dp[i][j] = min(dfs(i,j-1)+min(v[s[j]][0],v[s[j]][1]),dfs(i+1,j)+min(v[s[i]][0],v[s[i]][1])); 23 return dp[i][j]; 24 } 25 int main() 26 { 27 int i,n,m,a,b; 28 char c; 29 while(scanf("%d%d",&n,&m)!=EOF) 30 { 31 memset(dp,-1,sizeof(dp)); 32 cin>>s; 33 for(i = 1; i <= n; i++) 34 { 35 cin>>c>>a>>b; 36 v[c][0] = a; 37 v[c][1] = b; 38 } 39 int ans = dfs(0,m); 40 cout<<ans<<endl; 41 } 42 return 0; 43 }