题意:给定一个字符串d,要求用另一字符串s去匹配,其中s中的?可以为任何字符,*可以为任意个字符,求最小的匹配权值

思路:这题和CSDN英雄会的“反相互”类似,由于其中某些字符的不确定性,利用动态规划来对每个字符求解。只不过这个题更灵活了一些,但是本质是一样的。考虑s中的第i个元素,当匹配到d中的j元素时,用f[i][j]记录最小的权值和,关键问题就是如何分析'?'和'*'这两个元素。

(1)对于'?'比较简单,直接匹配上就可以,f[i][j]=f[i-1][j-1]+Offset

(2)对于'*',需要利用前面所有的信息求出最小值,但是题目N=10000,显然N^3的算法是行不通的,但是仔细考虑在遍历字符串d时,这个值是线性增加的,因此就可以利用这一点来构造N^2复杂度的算法,面对'*',可选的值有f[i-1][j-1],f[i-1][j]和f[i][j-1]三项,从中可以提取出'*'的最优状态

注意:此题的思路不难,但是时间卡的很紧,而且利用滚动数组压缩空间导致了数据边界问题特别严重,需要多多注意。

#include <iostream>
#include <string>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <memory>
#include <cmath>
#include <bitset>
#include <queue>
#include <vector>
#include <stack>
using namespace std; #define CLR(x,y) memset(x,y,sizeof(x))
#define MIN(m,v) (m)<(v)?(m):(v)
#define MAX(m,v) (m)>(v)?(m):(v)
#define ABS(x) ((x)>0?(x):-(x))
#define rep(i,x,y) for(i=x;i<y;++i) const int MAXN = 10050;
const int INF = 1<<30; int f[2][MAXN];
char s[MAXN],d[MAXN]; int Solve()
{
int ls,ld;
int i,j;
int t,tmp,tmp1,tmp2;
while(scanf("%s%s",&s[1],&d[1])!=EOF)
{
t = 0;
ls = strlen(&s[1]);
ld = strlen(&d[1]); rep(j,0,ld+1)
f[0][j] = INF;
rep(j,0,ld+1)
f[1][j] = 0; rep(i,1,ls+1){
rep(j,1,ld+1){
if(s[i]==d[j] || s[i]=='?'){
if(f[1-t][j]==0) f[t][j] = d[j]-'a'+1;
else f[t][j] = f[1-t][j-1]+d[j]-'a'+1;
}else if(s[i]=='*'){
tmp = MIN(f[1-t][j-1],f[t][j-1])+d[j]-'a'+1;
tmp1 = f[1-t][j];
f[t][j] = MIN(tmp,tmp1);
}
else
f[t][j] = INF; }
f[t][0] = INF;
t = 1-t;
} int ans = INF;
t = 1-t;
rep(i,1,ld+1)
ans = MIN(f[t][i],ans);
if(ans >300000)
ans = -1;
printf("%d\n",ans);
}
} int main()
{
Solve();
return 0;
}

{POJ}{3988}{Software Industry Revolution}{DP好题}的更多相关文章

  1. poj-3898 Software Industry Revolution DP

    题目链接: http://poj.org/problem?id=3898 题目意思: 有两个字符串,模式串和原串.每个字母有一个权值,a为1,b为2,...z为26 模式串中‘ ?’可以被一个字母代替 ...

  2. POJ:2385-Apple Catching(dp经典题)

    Apple Catching Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 14311 Accepted: 7000 Descr ...

  3. POJ Corn Fields 状态压缩DP基础题

    题目链接:http://poj.org/problem?id=3254 题目大意(名称什么的可能不一样,不过表达的意思还是一样的): 种玉米 王小二从小学一年级到现在每次考试都是班级倒数第一名,他的爸 ...

  4. POJ 2342 Anniversary party 树形DP基础题

    题目链接:http://poj.org/problem?id=2342 题目大意:在一个公司中,每个职员有一个快乐值ai,现在要开一个party,邀请了一个员工就不可能邀请其直属上司,同理邀请了一个人 ...

  5. POJ 2486 Apple Tree (树形dp 经典题)

    #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const ...

  6. poj 3254 状压dp入门题

    1.poj 3254  Corn Fields    状态压缩dp入门题 2.总结:二进制实在巧妙,以前从来没想过可以这样用. 题意:n行m列,1表示肥沃,0表示贫瘠,把牛放在肥沃处,要求所有牛不能相 ...

  7. POJ 1155 TELE 背包型树形DP 经典题

    由电视台,中转站,和用户的电视组成的体系刚好是一棵树 n个节点,编号分别为1~n,1是电视台中心,2~n-m是中转站,n-m+1~n是用户,1为root 现在节点1准备转播一场比赛,已知从一个节点传送 ...

  8. POJ 2342 树形DP入门题

    有一个大学的庆典晚会,想邀请一些在大学任职的人来參加,每一个人有自己的搞笑值,可是如今遇到一个问题就是假设两个人之间有直接的上下级关系,那么他们中仅仅能有一个来參加,求请来一部分人之后,搞笑值的最大是 ...

  9. poj 2955 Brackets (区间dp基础题)

    We give the following inductive definition of a “regular brackets” sequence: the empty sequence is a ...

随机推荐

  1. 【转】Java代码规范

    [转]Java代码规范 http://blog.csdn.net/huaishu/article/details/26725539

  2. C#实现对Windows 服务安装

    Windows服务作用:定时用户消息推送,WEB程序实时统计等 Windows服务创建:C#创建服务的方式也有很多种,建议大家在做之前可以先全面了解一下这方面东西再去动手这样便于解决中间遇到一些比较棘 ...

  3. Python xlrd、xlwt、xlutils修改Excel文件

    一.xlrd读取excel 这里介绍一个不错的包xlrs,可以工作在任何平台.这也就意味着你可以在Linux下读取Excel文件.首先,打开workbook:    import xlrdwb = x ...

  4. 黄聪:GeckoWebBrowser多窗口独立cookie

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  5. Zedboard安装桌面系统ubuntu及opencv(1)

    最近一直在搞板子,想帮Zedboard安装一个opencv谁知道困难重重,而且网络几乎没有任何资料可以参考,只有陆佳华的<嵌入式软硬件协同设计实战指南>可以参考. 但是这本书讲得不清不楚, ...

  6. codeforces E. Famil Door and Roads 期望

    一棵树,n个节点,边长为1,有q个询问,每个询问给出u,v(u != v),问在树上等概率加一条边,如果使得u,v在一个环内,则这种加边方式是合法的,此时的值为环的长度,所有合法的加边方式出现的概率相 ...

  7. Hibernate4 获取SessionFactory

    import org.hibernate.HibernateException; import org.hibernate.SessionFactory; import org.hibernate.c ...

  8. 在Ubuntu下进行MongoDB安装步骤

    一. 在Ubuntu下最傻瓜的步骤(以下都在root用户下进行操作): 1.运行"apt-get install mongo" 如果遇到找不到安装包的话运行"apt-ge ...

  9. CuteSTL——跟着感觉造轮子

    置顶推荐: CuteSTL:https://github.com/jxd134/algorithm/tree/master/CuteSTL TinySTL:https://github.com/zou ...

  10. 设计一个Stack,要求Push、Pop、获取最大最小值时间复杂度都为O(1)

    面试的时候,面试官让设计一个栈,要求有Push.Pop和获取最大最小值的操作,并且所有的操作都能够在O(1)的时间复杂度完成. 当时真没啥思路,后来在网上查了一下,恍然大悟,只能恨自己见识短浅.思路不 ...