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

 

你可能感兴趣的:(heap)