poj3280Cheapest Palindrome(记忆化)

链接

真的1A了。。

一开始想复杂了 想着补全再删 没想好 后来想到递归 大的回文串是由小的推过来的 

一直递归下去 对于当前的i,j可以选择保留或者删除 选个最小的

 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 }
View Code

 

posted @ 2013-08-25 13:47  _雨  阅读(237)  评论(0编辑  收藏  举报