博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Codeforces 67C Sequence of Balls 编辑距离 dp
阅读量:6705 次
发布时间:2019-06-25

本文共 1244 字,大约阅读时间需要 4 分钟。

题目链接:

有一个交换操作比較特殊,所以记录每一个点距离自己近期的那个字符的位置

然后交换就相当于把第一行要交换的2个字符 之间的字符都删掉

把第二行要交换的2个字符 之间的字符都插入第一行的2个字符之间

然后再进行交换。

#include 
#include
#include
using namespace std;#define inf 10000000#define N 4005#define get_min(a,b) {a=min(a,b);}int dp[N][N], t1, t2, t3, t4;int p1[N][30], p2[N][30];char s[N], t[N];int n, m;void input(){ scanf("%s",s+1); scanf("%s",t+1); n = strlen(s+1); m = strlen(t+1); memset(p1[0], -1, sizeof p1[0]); memset(p2[0], -1, sizeof p2[0]);}int main(){ int i,j,x,y; while(~scanf("%d %d %d %d",&t1,&t2,&t3,&t4)){ input(); for(i = 0; i <= n; i++)for(j = 0; j <= m; j++)dp[i][j] = inf; dp[0][0] = 0; for(i = n; i ; i--) { memcpy(p1[i], p1[i+1], sizeof p1[i]); p1[i][s[i]-'a']=i; } for(i = m; i; i--) { memcpy(p2[i], p2[i+1], sizeof p2[i]); p2[i][t[i]-'a']=i; } for(i = 0; i <= n; i++) for(j = 0; j <= m; j++) { if(s[i+1] == t[j+1]) get_min(dp[i+1][j+1], dp[i][j]); get_min(dp[i+1][j], dp[i][j]+t2); get_min(dp[i][j+1], dp[i][j]+t1); get_min(dp[i+1][j+1], dp[i][j]+t3); if ((x = p1[i + 2][t[j + 1] - 'a']) && (y = p2[j + 2][s[i + 1] - 'a'])) { get_min(dp[x][y], dp[i][j] + (x - i - 2) * t2 + (y - j - 2) * t1 + t4); } } cout<
<

转载地址:http://wnflo.baihongyu.com/

你可能感兴趣的文章
[CareerCup] 3.1 Implement Three Stacks using Array 使用数组来实现三个栈
查看>>
《xUnit Test Patterns》学习笔记5 - xUnit基础
查看>>
Linux下锁定账号,禁止登录系统的设置总结
查看>>
STM32启动过程解析-2.02固件库启动文件分析
查看>>
PLSQL Developer设置及快捷键设置
查看>>
《深入浅出MFC》笔记(四)
查看>>
第 15 章 Div+CSS页面设计
查看>>
[LeetCode] Maximum Size Subarray Sum Equals k 最大子数组之和为k
查看>>
linux运维
查看>>
Go中的CGI包使用
查看>>
移动端产品上线流程
查看>>
博客园被黑了?
查看>>
[Struts]学习日记2 - 增加一些验证
查看>>
js 获取浏览器高度和宽度值(多浏览器)
查看>>
防CSRF攻击:一场由重复提交的问题引发的前端后端测试口水战
查看>>
第 23 章 H3C ICG(Information Communication Gateway)
查看>>
asp.net中对URL的一些操作
查看>>
9.4. title
查看>>
Android 中文api (88)——SharedPreferences
查看>>
零元学Expression Blend 4 &ndash; Chapter 20 以实作案例学习Childwindow
查看>>