SRM 509 DIV1 500pt(DP)
给定一个字符串,可以对其进行修改,删除,增加操作,相应的操作有对应的花费,要求你用最小的花费把字符串变为回文串
题目做法
先搞一遍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)的更多相关文章
- SRM 514 DIV1 500pt(DP)
题目简述 给定一个H×W大小的矩阵,每个格子要么是1~9中的一个数,要么是".",要求你把“.”填成具体的数字(1~9),并且符合以下两个要求: 对于所有的整数r 和 c( 0 & ...
- SRM 511 DIV1 500pt(DP)
题目简述 给定n个数,两个人轮流取数,和之前两个人的取的数或起来,谁不能取数或者谁取到的数和之前的数或值为511谁输,问谁能够赢? 题解 刚开始的想法是直接搜,不过需要记录取过的值的状态,2^50显然 ...
- SRM 508 DIV1 500pt(DP)
题目简述 给定一个大小为 n的序列(n<=10)R,要求你计算序列A0, A1, ..., AN-1的数量,要求A序列满足A0 + A1 + ... + AN-1 = A0 | A1 | ... ...
- SRM 502 DIV1 500pt(DP)
题目简述 给定比赛时间T和n个题目,你可以在任意时间提交题目,每个题目有一个初始分数maxPoints[i],每个单位时间题目的分数将会减少pointsPerMinute[i],即如果在时间t解决了第 ...
- SRM 501 DIV1 500pt(DP)
题目简述 给定一个长度为n的序列,每个数值的范围为[-1,40],-1可以替换成0~40之间的数,要求你求出符合以下条件的序列有多少个? 1.每个数都是0~40之间的数 2.对于每一个数A[i],都需 ...
- 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 ...
- SRM 358(1-250,500pt)
DIV1 250pt 题意:电视目前停留在第100台,有一个遥控器,可以向上或向下换台(需要按键一次),也可以按一些数字,然后直接跳到该台(需要按键次数等于数字数,不需要按确定键).但是,这个遥控一些 ...
- SRM 601(1-250pt,500pt)
DIV1 250pt 题意:有很多袋子,里面装有苹果和橘子(也可能没有),给出每个袋子里有多少个苹果,多少个橘子.如果每个袋子里含有水果的总数都不小于x个,则可以从每个袋子里都拿出x个水果(拿出苹果和 ...
- Topcoder SRM 643 Div1 250<peter_pan>
Topcoder SRM 643 Div1 250 Problem 给一个整数N,再给一个vector<long long>v; N可以表示成若干个素数的乘积,N=p0*p1*p2*... ...
随机推荐
- 深度卷积神经网络用于图像缩放Image Scaling using Deep Convolutional Neural Networks
This past summer I interned at Flipboard in Palo Alto, California. I worked on machine learning base ...
- Learning Lua Programming (2) Lua编程基础
开始学习Lua编程,首先从一些简单的语法开始. 一.编辑环境 下面推荐一个Lua编程的IDE,感觉是很强大的.ZeroBrane Studio,windows平台,mac平台都有.点击打开链接 官方 ...
- 2014年百度之星程序设计大赛 - 资格赛 1004 Labyrinth(Dp)
题目链接 题目: Labyrinth Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- 宏buf_pool_t
typedef struct buf_pool_struct buf_pool_t; struct buf_pool_struct{ /** @name General fields */ /* @{ ...
- BootStrap基本样式
文本对齐风格:.text-left:左对齐.text-center:居中对齐.text-right:右对齐.text-justify:两端对齐 取消列表符号:.list-unstyled内联列表:.l ...
- fastdfs-client-java 文件上传
FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储.文件同步.文件访问(文件上传.文件下载)等,解决了大容量存储和负载均衡的问题.特别适合以文件为载体的在线服务,如相 ...
- C# winform 窗体从右下角向上弹出窗口效果
参考自 http://blog.csdn.net/yilan8002/article/details/7197981 /// <summary> /// 窗体动画函数 注意:要引用Syst ...
- 运维角度浅谈MySQL数据库优化(转)
一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架构才逐渐完善.这篇博文主要谈MySQL数据库发展周期中所面临的问题及优化方案,暂且抛开前端应用不说,大致分 ...
- Oracle 手工清除回滚段的几种方法
关于回滚段的问题,之前也小整理过一个,参考: Current online Redo 和 Undo 损坏的处理方法 http://blog.csdn.net/tianlesoftware/articl ...
- 在delphi中, reintroduce作用
在delphi中, reintroduce作用 当在子类中重载或者重新声明父类的虚方法时,使用 reintroduce 关键字告知编译器,可以消除警告信息.如: TPar ...