题目简述

给定一个字符串,可以对其进行修改,删除,增加操作,相应的操作有对应的花费,要求你用最小的花费把字符串变为回文串

题目做法

先搞一遍floyed把各种操作的最小花费求出来,然后就是类似编辑距离的DP了,这题坑了好久。。。中间结果会爆int,我设置的inf=0x3f3f3f3f,中间结果有inf+inf+inf..刚开始dp数组是int型的。。。这里搞了好几才发现这问题。。。西安现场赛也遇到这个问题了。。。然后也是浪费了将近100分钟的时间。。。导致后面做题的时间不够了。。。

代码:

 #define maxn 30
int changeCost[maxn][maxn], addCost[maxn], eraseCost[maxn];
LL dp[][];
class PalindromizationDiv1
{
public:
int getMinimumCost(string word, vector <string> operations)
{
memset(changeCost, 0x3f, sizeof(changeCost));
memset(addCost, 0x3f, sizeof(addCost));
memset(eraseCost, 0x3f, sizeof(eraseCost));
for (int i = ; i < operations.size(); i++)
{
stringstream ss(operations[i]);
string s;
char a, b;
int num;
ss >> s;
if (s == "add")
{
ss >> a >> num;
addCost[a - 'a'] = num;
}
if (s == "erase")
{
ss >> a >> num;
eraseCost[a - 'a'] = num;
}
if (s == "change")
{
ss >> a >> b >> num;
changeCost[a - 'a'][b - 'a'] = num;
}
}
for (int i = ; i < ; i++) changeCost[i][i] = ;
for (int k = ; k < ; k++)
for (int i = ; i < ; i++)
for (int j = ; j < ; j++)
{
if (i == j || j == k || i == k) continue;
changeCost[i][j] = min(changeCost[i][j], changeCost[i][k] + changeCost[k][j]);
} for (int i = ; i < ; i++)
for (int j = ; j < ; j++)
{
addCost[i] = min(addCost[i], addCost[j] + changeCost[j][i]);
eraseCost[i] = min(eraseCost[i], changeCost[i][j] + eraseCost[j]);
}
int n = word.size();
memset(dp, 0x3f, sizeof(dp));
for (int i = n - ; i >= ; i--)
{
dp[i][i] = dp[i][i - ] = ;
for (int j = i + ; j < n; j++)
{
int a = word[i] - 'a', b = word[j] - 'a';
dp[i][j] = min(dp[i][j], dp[i + ][j] + eraseCost[a]);
dp[i][j] = min(dp[i][j], dp[i][j - ] + eraseCost[b]);
for (int k = ; k < ; k++)
{
dp[i][j] = min(dp[i][j], dp[i + ][j] + addCost[k] + changeCost[a][k]);
dp[i][j] = min(dp[i][j], dp[i][j - ] + addCost[k] + changeCost[b][k]);
dp[i][j] = min(dp[i][j], dp[i + ][j - ] + changeCost[a][k] + changeCost[b][k]);
}
}
}
LL ret = dp[][n - ];
return ret >= INF ? - : (int)ret;
}
};

SRM 509 DIV1 500pt(DP)的更多相关文章

  1. SRM 514 DIV1 500pt(DP)

    题目简述 给定一个H×W大小的矩阵,每个格子要么是1~9中的一个数,要么是".",要求你把“.”填成具体的数字(1~9),并且符合以下两个要求: 对于所有的整数r 和 c( 0 & ...

  2. SRM 511 DIV1 500pt(DP)

    题目简述 给定n个数,两个人轮流取数,和之前两个人的取的数或起来,谁不能取数或者谁取到的数和之前的数或值为511谁输,问谁能够赢? 题解 刚开始的想法是直接搜,不过需要记录取过的值的状态,2^50显然 ...

  3. SRM 508 DIV1 500pt(DP)

    题目简述 给定一个大小为 n的序列(n<=10)R,要求你计算序列A0, A1, ..., AN-1的数量,要求A序列满足A0 + A1 + ... + AN-1 = A0 | A1 | ... ...

  4. SRM 502 DIV1 500pt(DP)

    题目简述 给定比赛时间T和n个题目,你可以在任意时间提交题目,每个题目有一个初始分数maxPoints[i],每个单位时间题目的分数将会减少pointsPerMinute[i],即如果在时间t解决了第 ...

  5. SRM 501 DIV1 500pt(DP)

    题目简述 给定一个长度为n的序列,每个数值的范围为[-1,40],-1可以替换成0~40之间的数,要求你求出符合以下条件的序列有多少个? 1.每个数都是0~40之间的数 2.对于每一个数A[i],都需 ...

  6. SRM DIV1 500pt DP

    SRM 501 DIV1 500pt SRM 502 DIV1 500pt SRM 508 DIV1 500pt SRM 509 DIV1 500pt SRM 511 DIV1 500pt SRM 5 ...

  7. SRM 358(1-250,500pt)

    DIV1 250pt 题意:电视目前停留在第100台,有一个遥控器,可以向上或向下换台(需要按键一次),也可以按一些数字,然后直接跳到该台(需要按键次数等于数字数,不需要按确定键).但是,这个遥控一些 ...

  8. SRM 601(1-250pt,500pt)

    DIV1 250pt 题意:有很多袋子,里面装有苹果和橘子(也可能没有),给出每个袋子里有多少个苹果,多少个橘子.如果每个袋子里含有水果的总数都不小于x个,则可以从每个袋子里都拿出x个水果(拿出苹果和 ...

  9. Topcoder SRM 643 Div1 250<peter_pan>

    Topcoder SRM 643 Div1 250 Problem 给一个整数N,再给一个vector<long long>v; N可以表示成若干个素数的乘积,N=p0*p1*p2*... ...

随机推荐

  1. C++:用成员初始化列表对数据成员初始化

    1.在声明类时,对数据成员的初始化工作一般在构造函数中用赋值语句进行. 例如: class Complex{ private: double real; double imag; public: Co ...

  2. 3、JPA一些常用的注解

    常用注解有下面这些: ①:@Entity.@Table.@Id.@GeneratedValue.@Column.@Basic ②:@Transient 用于忽略某个属性,而不对该属性进行持久化操作 ③ ...

  3. 简单的SocketExample

    客户端//---------------VerySimpleClient.java package SocketExample; // Tue Nov 2 18:34:53 EST 2004 // / ...

  4. NDK xxxxx could not be resolved解决方法

    Type '*****' could not be resolved Method '******' could not be resolved     问题解决   以下为未尝试方法,如果上面方法解 ...

  5. i386 和amd64 的意思

    首先可以简化一个概念,i386=Intel 80386.其实i386通常被用来作为对Intel(英特尔)32位微处理器的统称. Windows NT类系统的安装盘上,通常i386是其根上的一个文件夹, ...

  6. BZOJ 2005 能量采集(容斥原理)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2005 题意:给定n和m,求 思路:本题主要是解决对于给定的t,有多少对(i,j)满足x= ...

  7. poj 3277 City Horizon (线段树 扫描线 矩形面积并)

    题目链接 题意: 给一些矩形,给出长和高,其中长是用区间的形式给出的,有些区间有重叠,最后求所有矩形的面积. 分析: 给的区间的范围很大,所以需要离散化,还需要把y坐标去重,不过我试了一下不去重 也不 ...

  8. VS2010解决方案不显示无法添加项目问题

    问题:在VS2010中不显示解决方案,导致不能添加项目. 方法:工具-选项-项目和解决方案-选中“总是显示解决方案”,ok

  9. HDU 1213 How Many Tables (并查集,常规)

    并查集基本知识看:http://blog.csdn.net/dellaserss/article/details/7724401 题意:假设一张桌子可坐无限多人,小明准备邀请一些朋友来,所有有关系的朋 ...

  10. exec、eval

    #!/usr/bin/env python3 # -*- coding: utf-8 -*- #info #warning def log(message): print('------------- ...