Vijos P1680距离

题目

背景

简单的DP

描述

设有字符串X,我们称在X的头尾及中间插入任意多个空格后构成的新字符串为X的扩展串,如字符串X为”abcbcd”,则字符串“abcb_c_”,“_a_bcbcd_”和“abcb_c_”都是X的扩展串,这里“_”代表空格字符。

如果A1是字符串A的扩展串,B1是字符串B的扩展串,A1与B1具有相同的长度,那么我扪定义字符串A1与B1的距离为相应位置上的字符的距离总和,而两个非空格字符的距离定义为它们的ASCII码的差的绝对值,而空格字符与其他任意字符之间的距离为已知的定值K,空格字符与空格字符的距离为0。在字符串A、B的所有扩展串中,必定存在两个等长的扩展串A1、B1,使得A1与B1之间的距离达到最小,我们将这一距离定义为字符串A、B的距离。

请你写一个程序,求出字符串A、B的距离。

格式

输入格式

输入文件第一行为字符串A,第二行为字符串B。A、B均由小写字母组成且长度均不超过2000。第三行为一个整数K(1≤K≤100),表示空格与其他字符的距离。

输出格式

输出文件仅一行包含一个整数,表示所求得字符串A、B的距离。

样例1

样例输入1[复制]

cmc
snmn
2

样例输出1[复制]

10

限制

1s

提示

献给DP初学者,同时给各位oier增长NOIP2009信心~~

题解

这道题目的话,其实就是LCS,f[i][j]=min{f[i-1][j-1]+dist(a[i],b[j]),f[i-1][j]+k,f[i][j-1]+k}

代码

 1 /*Author:WNJXYK*/
 2 #include<cstdio>
 3 #include<iostream>
 4 #include<cstring>
 5 #include<string>
 6 using namespace std;
 7 string a,b;
 8 int la,lb;
 9 const int Maxn=2000;
10 long long f[Maxn+5][Maxn+5];
11 long long k;
12 int remin(int a,int b){
13     if (a<b) return a;
14     return b;
15 }
16 int abs(int x){
17     if (x<0) return -x;
18     return x;
19 }
20 int main(){
21     cin>>a>>b;
22     cin>>k;
23     la=a.length();lb=b.length();
24     memset(f,127,sizeof(f));
25     f[0][0]=0;
26     for (int i=1;i<=la;i++) f[i][0]=f[i-1][0]+k;
27     for (int i=1;i<=lb;i++) f[0][i]=f[0][i-1]+k;
28     for (int i=1;i<=la;i++){
29         for (int j=1;j<=lb;j++){
30             f[i][j]=remin(f[i][j],f[i-1][j-1]+abs(a[i-1]-b[j-1]));
31             f[i][j]=remin(f[i][j],f[i-1][j]+k);
32             f[i][j]=remin(f[i][j],f[i][j-1]+k);
33         }
34     }
35     cout<<f[la][lb]<<endl;
36     return 0;
37 }

时间: 2024-10-10 16:37:38

Vijos P1680距离的相关文章

Vijos P1002 过河 (NOIP提高组2005)

链接:https://www.vijos.org/p/1002 解析: 若 p*x+(p+1)*y=Q(采用跳跃距离p和p+1时可以跳至任何位置Q),则在Q ≥ P*(P-1)时是一定有解的. 由于题目给出的一个区间是1≤S≤T≤10,于是当相邻的两个石子之间的距离不小于8*9=72时,则后面的距离都可以到达,我们就可以认为它们之间的距离就是72.如此一来,我们就将原题L的范围缩小为了100*72=7200,动态规划算法完全可以承受了. 但是当S=T时,上述等式是无法使用的,在这种情况下,只需要

Vijos[1983]NOIP2015Day2T3 运输计划 transport LCA

题目链接Vijos 题目链接UOJ 转载一个大佬的题解: 点击这里->银牌爷题解 主要考察二分查找.树上倍增.贪心."树上前缀和".题目是一颗树,要求将一条边的权值变为0,使得所有运输计划的最大时间最小.直觉告诉我们,这是一个树上倍增的题目,但是它却不像前几年的 Day2T3 开车旅行那样纯倍增,或许更像疫情控制一些,倍增只是辅助算法,还需要配合其他算法.由于要使所有运输计划的最大时间最小,不难想到二分答案的方法.使C(t)表示是否可以改造一条边,使得改造之后所有运输计划中最长的

Vijos 包裹快递(二分)

背景 小K成功地破解了密文.但是乘车到X国的时候,发现钱包被偷了,于是无奈之下只好作快递员来攒足路费去Orz教主…… 描述 一个快递公司要将n个包裹分别送到n个地方,并分配给邮递员小K一个事先设定好的路线,小K需要开车按照路线给的地点顺序相继送达,且不能遗漏一个地点.小K得到每个地方可以签收的时间段,并且也知道路线中一个地方到下一个地方的距离.若到达某一个地方的时间早于可以签收的时间段,则必须在这个地方停留至可以签收,但不能晚于签收的时间段,可以认为签收的过程是瞬间完成的. 为了节省燃料,小K希

vijos 1476 旅游规划题解

题目链接:https://vijos.org/p/1476 解:因为这一定是一棵树,所以我们多画几次图,就会发现所有的最长路径中心点都一样,且中心点把这条最长路径分成两段等长的路. 那么做法就很简单啦,先求出图的最长路径长度(称为直径),然后找到中心点(如果最长路径长度为偶数的话,就新建一个点,连上中间的两个点,并把原来两点间的路径删去),然后做一次dfs,那些到中心点的距离为半径的,这个点包括它到中心点的路径上的点都是在最长路径上的. 求最长路径有两种方法: 1.随便取一个点为根,先做一次df

vijos 1476 旅游规划(csapc)

描述 W市的交通规划出现了重大问题,市政府下决心在全市的各大交通路口安排交通疏导员来疏导密集的车流.但由于人员不足,W市市长决定只在最需要安排人员的路口安放人员.具体说来,W市的交通网络十分简单,它包括n个交叉路口和n-1条街道,任意一条街道连接两个交叉路口,并且任意两个交叉路口之间都存在一条路径互相连接.经过长期调查结果显示如果一个交叉路口位于W市交通网的最长路径上,那么这个路口必然拥挤不堪,所谓最长路径定义为某条路径p=(v1,v2,v3-vk),路径经过的路口各不相同且城市中不存在长度>k

Vijos p1518河流 树形DP

https://vijos.org/p/1518 这题代码我基本是抄的,实在太难想了.但是也学到了一些东西. 比如:多叉树转二叉树存,这个细细一想,确实使得在dfs的时候,实现起来方便很多. 说一说具体 dfs的思路,思路和网上那个一模一样的,我刚学树形dp,可能上网看看总结下套路比较好. 设dfs(cur, hasPoint, k, dis)表示,现在处理到cur这个节点,离cur最近的那个仓库节点是hasPoint, 剩下k次设置仓库的机会,还有就是cur的爸爸距离hasPoint的距离.

Vijos 1451 圆环取数 【区间DP】

背景 小K攒足了路费来到了教主所在的宫殿门前,但是当小K要进去的时候,却发现了要与教主守护者进行一个特殊的游戏,只有取到了最大值才能进去Orz教主-- 描述 守护者拿出被划分为n个格子的一个圆环,每个格子上都有一个正整数,并且定义两个格子的距离为两个格子之间的格子数的最小值.环的圆心处固定了一个指针,一开始指向了圆环上的某一个格子,你可以取下指针所指的那个格子里的数以及与这个格子距离不大于k的格子的数,取一个数的代价即这个数的值.指针是可以转动的,每次转动可以将指针由一个格子转向其相邻的格子,且

【VIJOS】 p1009-p1012 清帝之惑

原题传送门:https://vijos.org/p/%E6%B8%85%E5%B8%9D%E4%B9%8B%E6%83%91 雍正 求平面上最近的两点的距离,O(nlogn)算法实现,详解见 http://blog.csdn.net/lytning/article/details/25370169 #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #incl

【枚举】Vijos P1012 清帝之惑之雍正

题目链接: https://vijos.org/p/1012 题目大意: 给n个坐标(n<=100 000),求直线距离最短是多少.数据较大用long long 或 double 题目思路: [枚举] 正解貌似是分治,不过我一看就暴力枚举+剪枝了. 先按x y为第一.第二关键字排序. 设当前最优解为c,如果当前的点对x坐标差的平方比最优解大就可以break了. 1 // 2 //by coolxxx 3 // 4 #include<iostream> 5 #include<algo