zoukankan      html  css  js  c++  java
  • 【动态规划】POJ3280- Cheapest Palindrome

    【题目大意】

    给出一个字符串,可以删除或添加一些字符,它们各自会消耗价值。问最少消耗多少价值,可以使得字符串变成回文的。

    【思路】

    事实上删除或添加字符的价值只需要保持较小的那一个。假设当前要将(j,i)转换为回文字符,那么它有以下三种情况:

    (1)在结尾添加或删除一个和开头一样的字符,f[j][i-1]+cost[s[i]-'a'];

    (2)在开头添加或删除一个和结尾一样的字符,f[j+1][i]+cost[s[j]-'a'];

    (3)如果开头和结尾的字符本来就是一样的,就有f[j+1][i-1]。

    【错误】

    初始化均为0,不要设置成INF了。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 using namespace std;
     5 
     6 const int MAXN=2000+50;
     7 int n,m;
     8 char s[MAXN];
     9 int f[MAXN][MAXN];
    10 int cost[MAXN];
    11 
    12 int main()
    13 {
    14     scanf("%d%d",&n,&m);
    15     getchar();
    16     scanf("%s",s);
    17     memset(f,0,sizeof(f));
    18     for (int i=0;i<n;i++)
    19     {
    20         getchar();
    21         char tempc;
    22         int a,b;
    23         scanf("%c%d%d",&tempc,&a,&b);
    24         cost[tempc-'a']=min(a,b);
    25     }
    26 
    27     for (int i=1;i<m;i++)
    28         for (int j=i-1;j>=0;j--)
    29         {
    30             f[j][i]=min( f[j+1][i]+cost[s[j]-'a'] , f[j][i-1]+cost[s[i]-'a']);
    31             if (s[j]==s[i]) f[j][i]=min(f[j][i],f[j+1][i-1]);
    32         }
    33     cout<<f[0][m-1]<<endl;
    34     return 0;
    35 }
  • 相关阅读:
    WPF游戏摘记地图编辑器(1)
    图片和视频操作核心代码
    WPF游戏摘记地图编辑器(2)
    序言
    Asp.Net 请求处理机制
    C#正则表达式
    ActiveX控件打包成Cab实现浏览器自动下载安装
    ios数据存储
    ARC 学习
    Ray's Learn Cocos2d 笔记(一)
  • 原文地址:https://www.cnblogs.com/iiyiyi/p/4814919.html
Copyright © 2011-2022 走看看