题目地址:http://poj.org/problem?id=3898

题目意思:

给你一个模式串,再给你一个原串,要你去匹配

模式串里面的?可对应任意一个字符

*号可对应0个或多个字符

其中a=1,b=2....要你找出在原串中能匹配出的最小值

如果不能就输出-1

这是一道DP的题,其实和LCS很像,但是打比赛的时候我竟然在想各种匹配算法啊,给跪了

尼玛DP简直就是一条不归路啊

解题思路:

用dp[i][j]来表示模式串的第i个和原串的第j个匹配时的值

不能匹配就是INF

那么有几个转移的

对于?,dp[i][j] = dp[i-1][j-1]+cost[j]

对于字符,如果s1[i]==s2[j],dp[i][j] = dp[i-1][j-1]+cost[j]

对于*,因为*可以对应0个或多个

则dp[i][j] = dp[i][j]=min{dp[i-1][k]+sum(cost[k]~cost[j])}

对于第三种还有优化

因为sum(cost[k]~cost[j]) = sum[j]-sum[k],所以我们用一个cur维护dp[i-1][k]-sum[k]的最小值

然后加sum[j]就OK了,这个就直接降了一个维度下来

实在是很妙啊,DP虽然有时候很难,但是想通了确实有美妙的地方在里面

下面上代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; const int maxn = 1010; char s1[maxn];
char s2[maxn*10]; int dp[maxn][maxn*10];
int sum[maxn*10];
const int inf = 0x3f3f3f3f; int main()
{
while(~scanf("%s%s",&s1[1],&s2[1]))
{
int len1 = strlen(&s1[1]);
int len2 = strlen(&s2[1]); sum[0] = 0; for(int i=1;i<=len2;i++)
sum[i] = sum[i-1]+(s2[i]-'a'+1);
for(int i=0;i<=len1;i++)
for(int j=0;j<=len2;j++)
dp[i][j] = inf; //对于可以做头的原串,初始化
for(int i=0;i<=len2;i++)
{
if(i>0 && (s1[1]=='?' || s1[1]==s2[i]))
dp[1][i] = sum[i]-sum[i-1];
else if(s1[1]=='*')
dp[1][i] = 0;
} bool flag = true;
for(int i=2;i<=len1;i++)
{
flag = false;
if(s1[i]=='*')
{
int cur = inf;
if(dp[i-1][0] == 0)
{
dp[i][0] == 0;
cur = 0;
flag = true;
}
for(int j=1;j<=len2;j++)
{
if(dp[i-1][j]-sum[j]<cur)
cur=dp[i-1][j] - sum[j];
if(cur+sum[j] < dp[i][j])
dp[i][j] = cur+sum[j],flag = true;
} }
else
{
for(int j=1;j<=len2;j++)
{
if(dp[i-1][j-1]==inf)
continue;
if(s1[i]=='?' || s2[j]==s1[i])
{
dp[i][j] = min(dp[i][j],dp[i-1][j-1]+s2[j]-'a'+1);
flag = true;
}
}
}
if(!flag)
break;
} if(!flag)
{
puts("-1");
continue;
} int ans = inf; for(int i=1;i<=len2;i++)
ans = min(ans,dp[len1][i]);
if(ans == -1)
puts("-1");
else
printf("%d\n",ans); }
return 0;
}

Software Industry Revolution----POJ3898----DP的更多相关文章

  1. poj-3898 Software Industry Revolution DP

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

  2. {POJ}{3988}{Software Industry Revolution}{DP好题}

    题意:给定一个字符串d,要求用另一字符串s去匹配,其中s中的?可以为任何字符,*可以为任意个字符,求最小的匹配权值 思路:这题和CSDN英雄会的“反相互”类似,由于其中某些字符的不确定性,利用动态规划 ...

  3. Codeforces Round #189 (Div. 1) C - Kalila and Dimna in the Logging Industry 斜率优化dp

    C - Kalila and Dimna in the Logging Industry 很容易能得到状态转移方程 dp[ i ] = min( dp[ j ] + b[ j ] * a[ i ] ) ...

  4. CF 319C - Kalila and Dimna in the Logging Industry 斜率优化DP

    题目:伐木工人用电锯伐木,一共需要砍n棵树,每棵树的高度为a[i],每次砍伐只能砍1单位高度,之后需要对电锯进行充电,费用为当前砍掉的树中最大id的b[id]值.a[1] = 1 , b[n] = 0 ...

  5. Poj 1973 Software Company(二分+并行DP)

    题意:软件公司接了两个项目,来自同一个合同,要一起交付.该公司有n个程序猿来做这两个项目A和B,每个项目都被分为m个子项目,给定每个程序猿做一个A中的子项目需要的时间Xi秒,和做B中的子项目所需时间Y ...

  6. UVALive - 2031 Dance Dance Revolution 三维dp

    题目大意:有一个胖子在玩跳舞机.刚開始的位置在(0,0).跳舞机有四个方向键,上左下右分别相应1,2,3,4.如今有下面规则 1.假设从0位置移动到随意四个位置,消耗能量2 2.假设从非0位置跳到相邻 ...

  7. {POJ}{动态规划}{题目列表}

    动态规划与贪心相关: {HDU}{4739}{Zhuge Liang's Mines}{压缩DP} 题意:给定20个点坐标,求最多有多少个不相交(点也不相交)的正方形 思路:背包问题,求出所有的正方形 ...

  8. 微软职位内部推荐-Software Development Engineer

    微软近期Open的职位: Job Title: Software Development Engineer Work Location: Suzhou, China The Office 365 Co ...

  9. 【Software Test】Introduction to Software Testing

    Introduction to Software Testing 文章目录 Going to Learn --. Evolution of The Software Industry Errors, ...

随机推荐

  1. 采用malloc分别分配2KB个人空间,然后,realloc调整到6KB、1MB、3MB、10MB场地,分别这五内存“A”、“B”、“C”、“D”、“E”灌装

    #include<stdio.h> #include<stdlib.h> #include<string.h> #include<malloc.h> i ...

  2. 3D人脸识别预处理,3D face recognition preprocess

    本文由兔崩溃公布http://blog.csdn.net/smartempire/article/details/31373817. 转载请注明出处.howdeshui#163.com 近期在做三维人 ...

  3. 关于Android开发中导出jar包后的资源使用问题解决

    我们经常遇到一个需求,就是给别人使用我们工程的时候,为了能够屏蔽代码,把代码封装成jar包提供给第三方使用,但是这样我们的资源文件怎么给对方用呢? 其实并不用这么的复杂,下面就介绍一下具体的方法 一, ...

  4. [探索]点点轻博客搬家到WordPress(一)

    摘要:点点博客备份XML通过DiandianToWordpress-beta.sh(文末给出)搬家到Wordpress博客 本人曾使用过点点轻博客,也深知像点点博客,Lofter博客导出的XML文件不 ...

  5. 在VirtualBox下安装CentOS教程(截图版)

    http://blog.csdn.net/kobe_lzq/article/details/7894718 使用的软件: VirtualBox 4.1.2 CentOS 5.6 x86_64  刻录的 ...

  6. Zend server最大化应用程序的性能、扩展性和可用性

    如果我有8个小时去砍到一棵树,我会花6个小时磨斧子”——林肯(美国总统) 你可以知道? 世界页面访问量的峰值超过7000万每分钟. CloudFare公司服务器问题,导致785000站点崩溃一小时. ...

  7. Linux内核头文件与内核与库的关系

    看上一篇文章中对buildroot的介绍,里面的文档第 3.1.1.1 Internal toolchain backend 节内容 C库会去访问Linux kernel headers(*.h)文件 ...

  8. postal邮件发送(二):Email headers,附件,图片介绍

    接上篇 http://www.cnblogs.com/mybky/p/5690567.html 1.邮件headers 除此之外,还有Reply-To,用于回复邮箱 2.邮件带有图片 邮件发送图片,p ...

  9. 条件变量signal与unlock的顺序

    编写同步队列时,有用到条件变量,对操作队列的线程进行同步.当队列为空时,允许get线程挂起,直到add线程向队列添加元素并通过唤醒条件变量,get线程继续向下运行.条件变量在多线程程序中用来实现“等待 ...

  10. linux下的中文编码问题

    很多linux的初学者都会碰到这样一个问题:把windows下的文档拷到linux系统,会出现乱码!其实这涉及到中文编码的问题.linux系统默认的是统一码(utf8).而如果你的文件是big5,显然 ...