POJ 3280 Cheapest Palindrome (DP)

POJ 3280 Cheapest Palindrome (DP)

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。



Description

Keeping track of all the cows can be a tricky task so Farmer John has installed a system to automate it. He has installed on each cow an electronic ID tag that the system will read as the cows pass by a scanner. Each ID tag’s contents are currently a single string with length M (1 ≤ M ≤ 2,000) characters drawn from an alphabet of N (1 ≤ N ≤ 26) different symbols (namely, the lower-case roman alphabet).

Cows, being the mischievous creatures they are, sometimes try to spoof the system by walking backwards. While a cow whose ID is “abcba” would read the same no matter which direction the she walks, a cow with the ID “abcb” can potentially register as two different IDs (“abcb” and “bcba”).

FJ would like to change the cows’s ID tags so they read the same no matter which direction the cow walks by. For example, “abcb” can be changed by adding “a” at the end to form “abcba” so that the ID is palindromic (reads the same forwards and backwards). Some other ways to change the ID to be palindromic are include adding the three letters “bcb” to the begining to yield the ID “bcbabcb” or removing the letter “a” to yield the ID “bcb”. One can add or remove characters at any location in the string yielding a string longer or shorter than the original string.

Unfortunately as the ID tags are electronic, each character insertion or deletion has a cost (0 ≤ cost ≤ 10,000) which varies depending on exactly which character value to be added or deleted. Given the content of a cow’s ID tag and the cost of inserting or deleting each of the alphabet’s characters, find the minimum cost to change the ID tag so it satisfies FJ’s requirements. An empty ID tag is considered to satisfy the requirements of reading the same forward and backward. Only letters with associated costs can be added to a string.

Input

Line 1: Two space-separated integers:
N and
M

Line 2: This line contains exactly
M characters which constitute the initial ID string

Lines 3..
N+2: Each line contains three space-separated entities: a character of the input alphabet and two integers which are respectively the cost of adding and deleting that character.

Output

Line 1: A single line with a single integer that is the minimum cost to change the given name tag.

Sample Input

3 4
abcb
a 1000 1100
b 350 700
c 200 800

Sample Output

900

题意:一串字母序列。经过添加或删减某个字符使得序列成为回文,添加和删减都有花费,问花费最少多少。

设dp[i][j]为从i到j的花费。
dp[i][j] = min ( dp[i+1][j]+cost[i] , dp[i][j-1]+cost[j] );  ( a[i] != a[j] )
dp[i][j] = dp[i+1][j-1] ( a[i] == a[j] )
cost[]里存的就是每一个字符删减或者添加的较小的值,由于删掉a[i]和在j后面添加一个a[i]效果是一样的,仅仅需比較两者的花费谁更小

#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h>
using namespace std;
typedef long long LL;
const int MAX=0x3f3f3f3f;
int n,m,cost[30],dp[2007][2005];
char s[2005],cc[3];
int main()
{
    scanf("%d%d%s",&n,&m,s);
    for(int i=0;i<n;i++) {
        int xx,yy;
        scanf("%s %d %d",cc,&xx,&yy);
        cost[ cc[0]-'a' ] = min(xx,yy);
    }
    for(int j=1;j<m;j++)
        for(int i=j-1;i>=0;i--)
             if( s[i] == s[j] ) dp[i][j] = dp[i+1][j-1];
             else dp[i][j] = min( dp[i+1][j]+cost[ s[i]-'a' ] ,dp[i][j-1]+cost[ s[j]-'a' ] );
    printf("%d\n",dp[0][m-1]);
    return 0;
}

版权声明:本文博客原创文章,博客,未经同意,不得转载。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/117433.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • SCSA第四天总结「建议收藏」

    SCSA第四天总结「建议收藏」一、防共享技术:背景: 在企业的网络管理、在运营商代建的高校网络中出现了防共享上网的需求,即防代理、防一拖N的需求。 目前运营商以及企业需要面对共享上网主要带来的2个问题: 1、 在企业中,不少用户共享自己访问互联网的权限给其他用户,绕开了企业对用户设定的上网权限控制,使得原本没有上网权限的用户可以上网了,或者使得原本上网权限较低的用户拥有了较高的权限,给网络管理带来了诸多麻烦。 2、 在运营商承建和运维的高校网络中,遇到很多学生使用路由器或者其他软件方式,共享互联网的访问给其他同学或朋友,直

    2022年6月20日
  • samba文件共享服务配置过程_linuxsmb文件共享

    samba文件共享服务配置过程_linuxsmb文件共享samba文件共享服务

    2022年4月21日
  • js数组排序的几种方法

    js数组排序的几种方法1、冒泡排序以从小到大排序为例,冒泡排序的原理就是通过两层循环把数组中两两相邻的元素进行比较,是的大的元素放到后边,元素交换位置,从而一步步的交换元素的位置,使得最大的元素放到数组的末尾,这样内部的循环就进行了一轮,再根据外部的循环依次再把次大一点的元素放到数组的末尾,从而实现数组的逐步排序。代码如下://冒泡排序vararr=[52,3,8,57,75,2,1];for(…

    2022年4月29日
  • 计算机编程原理_如何编程

    计算机编程原理_如何编程一、Socket简介Socket是进程通讯的一种方式,即调用这个网络库的一些API函数实现分布在不同主机的相关进程之间的数据交换。几个定义:(1)IP地址:即依照TCP/IP协议分配给本地主机的网络地址,两个进程要通讯,任一进程首先要知道通讯对方的位置,即对方的IP。(2)端口号:用来辨别本地通讯进程,一个本地的进程在通讯时均会占用一个端口号,不同的进程端口号不同,因此在通

    2022年10月17日
  • ideal激活码[最新免费获取]

    (ideal激活码)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/ide…

    2022年4月1日
  • atittit.表单验证性质的原则和实施,以及选择和定义自己的兼容easyui dsl窗体身份验证规则

    atittit.表单验证性质的原则和实施,以及选择和定义自己的兼容easyui dsl窗体身份验证规则

    2022年1月8日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号