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 }
  • 相关阅读:
    python-获取网页源码及保存网页图片到本地实例
    python-随机向文件中写入100个名字实例
    python-计算文件中每个字出现的次数
    python-序列类型
    python-字符串
    python示例1(基本知识巩固)
    python-示例(基本知识巩固)
    [leetcode] Binary Tree Upside Down
    Trie 树
    第K大问题
  • 原文地址:https://www.cnblogs.com/iiyiyi/p/4814919.html
Copyright © 2011-2022 走看看