[HIHO1554] 最短的 Nore0061(DP)

题目链接:http://hihocoder.com/problemset/problem/1554

不能直接暴力,遇到相同的时候贪心给任意一个串。比如下列数据:

aaa

abc

abcaaa

应该在遇到相同的时候DP处理,f(i,j,k)表示ai bj sk的时候字符串的最短长度,还要考虑从s的哪个位置开始找的问题。

比较难发现的一个规律就是,起点不影响状态转移,所以把起点这一维删掉,枚举了一下起点dfs。(这个规律不是我发现的是我猜的

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3
 4 typedef long long LL;
 5 const int maxn = 3030;
 6 const int maxm = 110;
 7 int na, nb, ns;
 8 int f[maxm][maxm][maxn];
 9 char a[maxm], b[maxm], s[maxn];
10
11 int dfs(int i, int j, int k) {
12     if(i == na && j == nb) return 0;
13     if(k == ns) return 0x7f7f7f7f;
14     if(~f[i][j][k]) return f[i][j][k];
15     int ret = 0x7f7f7f7f;
16     if(i < na && a[i] == s[k]) ret = min(ret, dfs(i+1,j,k+1)+1);
17     if(j < nb && b[j] == s[k]) ret = min(ret, dfs(i,j+1,k+1)+1);
18     ret = min(ret, dfs(i,j,k+1)+1);
19     return f[i][j][k] = ret;
20 }
21
22 signed main() {
23     // freopen("in", "r", stdin);
24     while(~scanf("%s%s%s",a,b,s)) {
25         na = strlen(a); nb = strlen(b); ns = strlen(s);
26         memset(f, -1, sizeof(f));
27         int ret = 0x7f7f7f7f;
28         for(int i = 0; i < ns; i++) {
29             ret = min(ret, dfs(0,0,i));
30         }
31         printf("%d\n", ret==0x7f7f7f7f?-1:ret);
32     }
33     return 0;
34 }
时间: 2024-07-30 10:44:00

[HIHO1554] 最短的 Nore0061(DP)的相关文章

SDUT 1225-编辑距离(串型dp)

编辑距离 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 假设字符串的基本操作仅为:删除一个字符.插入一个字符和将一个字符修改成另一个字符这三种操作. 我们把进行了一次上述三种操作的任意一种操作称为进行了一步字符基本操作. 下面我们定义两个字符串的编辑距离:对于两个字符串a和b,通过上述的基本操作,我们可以把a变成b或b变成a,那么字符串a变成字符串b需要的最少基本字符操作步数称为字符串a和字符串b的编辑距离. 例如:a="A

LightOJ1316 A Wedding Party(状压DP)

这题事实上只需要关心15个商店和一个起点一个终点,预处理出这几个点之间的最短距离.Floyd会超时,用Dijkstra即可. 然后就是dp[u][S]表示已经经过商店集合S且当前在第u个商店所花的最少时间. 最后的结果是找到所有dp[u][S]有解且u能到达终点的最大的|S|,而最短时间就是dp[u][S]+dist[u][vt]. 细节还挺多的. 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm>

HDU - 2059 龟兔赛跑(多阶段决策dp)

http://acm.hdu.edu.cn/showproblem.php?pid=2059 初始把起点和终点也算做充电站,设dp[i]是到第i个充电站的最短时间,那么dp[n+1]即是乌龟到达终点的最短时间. 每次到达第i个点,j:0-i-1;去找能不能用从第j个充电站直接到达 i 来更新最短时间. 注意细节处理. 1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 using namespace

NYOJ 1067 Compress String(区间dp)

Compress String 时间限制:2000 ms  |  内存限制:65535 KB 难度:3 描述 One day,a beautiful girl ask LYH to help her complete a complicated task-using a new compression method similar to Run Length Encoding(RLE) compress a string.Though the task is difficult, LYH is

HDU2059 龟兔赛跑 【DP】

龟兔赛跑 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 11540    Accepted Submission(s): 4337 Problem Description 据说在很久很久以前,可怜的兔子经历了人生中最大的打击--赛跑输给乌龟后,心中郁闷,发誓要报仇雪恨,于是躲进了杭州下沙某农业园卧薪尝胆潜心修炼,终于练成了绝技,能够毫

UVA-1632 Alibaba (区间DP+滚动数组)

题目大意:在一条直线上有n件珠宝,已知每件珠宝的位置,并且第 i 件珠宝在 ti 时刻就消失,问能否将所有的珠宝收集起来?如果能,求出最短时间.搜集能瞬间完成. 题目分析:区间DP.dp(i,j,0)表示搜集区间(i,j)并且停留在左端所需的最短时间,dp(i,j,1)表示搜集区间(i,j)并且停留在右端所需的最短时间.状态转移方程为 dp(i,j,0)=min(dp(i+1,j,0)+t(i+1)-t(i),dp(i+1,j1,)+t(j)-t(i)),dp(i,j,1)=min(dp(i,j

POJ1661 Help Jimmy(dp)

"Help Jimmy" 是在下图所示的场景上完成的游戏. 场景中包括多个长度和高度各不相同的平台.地面是最低的平台,高度为零,长度无限. Jimmy老鼠在时刻0从高于所有平台的某处开始下落,它的下落速度始终为1米/秒.当Jimmy落到某个平台上时,游戏 者选择让它向左还是向右跑,它跑动的速度也是1米/秒.当Jimmy跑到平台的边缘时,开始继续下落.Jimmy每次下落的高度不能超过MAX米,不然就 会摔死,游戏也会结束. 设计一个程序,计算Jimmy到底地面时可能的最早时间. Inpu

HDU 5303 dp

一个环上有n个苹果树,每个树上有ai个苹果,你有一个容量为k的篮子,装满苹果后要回到起点清空篮子,问你从起点出发,摘完所有苹果所走的最短路程. 苹果最多有100000个 使用两个DP数组,dp[0][i]表示顺时针取i个苹果的最短路程,dp[1][i]表示逆时针取i个苹果的最短路程 ans=Min(dp[0][i],dp[1][sum-i]); #include "stdio.h" #include "string.h" #include "algorit

poj2686-Traveling by Stagecoach(状压dp)

题意: n张马票,m个城市,马票上有马数(决定速度),一张只能用一次,给出地图,求从城市a到b的最短时间. 分析:n值很小状态压缩 #include <map> #include <set> #include <list> #include <cmath> #include <queue> #include <stack> #include <cstdio> #include <vector> #include