Software Industry Revolution----POJ3898----DP
题目地址: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的更多相关文章
- poj-3898 Software Industry Revolution DP
题目链接: http://poj.org/problem?id=3898 题目意思: 有两个字符串,模式串和原串.每个字母有一个权值,a为1,b为2,...z为26 模式串中‘ ?’可以被一个字母代替 ...
- {POJ}{3988}{Software Industry Revolution}{DP好题}
题意:给定一个字符串d,要求用另一字符串s去匹配,其中s中的?可以为任何字符,*可以为任意个字符,求最小的匹配权值 思路:这题和CSDN英雄会的“反相互”类似,由于其中某些字符的不确定性,利用动态规划 ...
- 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 ] ) ...
- CF 319C - Kalila and Dimna in the Logging Industry 斜率优化DP
题目:伐木工人用电锯伐木,一共需要砍n棵树,每棵树的高度为a[i],每次砍伐只能砍1单位高度,之后需要对电锯进行充电,费用为当前砍掉的树中最大id的b[id]值.a[1] = 1 , b[n] = 0 ...
- Poj 1973 Software Company(二分+并行DP)
题意:软件公司接了两个项目,来自同一个合同,要一起交付.该公司有n个程序猿来做这两个项目A和B,每个项目都被分为m个子项目,给定每个程序猿做一个A中的子项目需要的时间Xi秒,和做B中的子项目所需时间Y ...
- UVALive - 2031 Dance Dance Revolution 三维dp
题目大意:有一个胖子在玩跳舞机.刚開始的位置在(0,0).跳舞机有四个方向键,上左下右分别相应1,2,3,4.如今有下面规则 1.假设从0位置移动到随意四个位置,消耗能量2 2.假设从非0位置跳到相邻 ...
- {POJ}{动态规划}{题目列表}
动态规划与贪心相关: {HDU}{4739}{Zhuge Liang's Mines}{压缩DP} 题意:给定20个点坐标,求最多有多少个不相交(点也不相交)的正方形 思路:背包问题,求出所有的正方形 ...
- 微软职位内部推荐-Software Development Engineer
微软近期Open的职位: Job Title: Software Development Engineer Work Location: Suzhou, China The Office 365 Co ...
- 【Software Test】Introduction to Software Testing
Introduction to Software Testing 文章目录 Going to Learn --. Evolution of The Software Industry Errors, ...
随机推荐
- 快速构建Windows 8风格应用13-SearchContract构建
原文:快速构建Windows 8风格应用13-SearchContract构建 本篇博文主要介绍如何在应用中构建SearchContract,相应的原理已经在博文<快速构建Windows 8风格 ...
- codeforces #262 DIV2 C称号Present(二分法+贪婪)
职务地址:http://codeforces.com/contest/460/problem/C 这个题是用二分枚举最小值.然后推断是否能在规定的次数内使得全部的数都达到这个值.推断的时候要用贪心的方 ...
- 2.2 LINQ中使用from子句指定数据源
数据源是LINQ查询中必不可少的元素,数据源是实现泛型接口IEnumerable<T>或IQueryable<T>的类对象. 可以将IEnumerable<T>简单 ...
- [译]内存中的Java数组是怎么样的
(文章翻译自What does a Java array look like in memory?) Java中的数组存储了两个中的一个类型:原始类型的类或则是引用类型(比如指针) 当一个对象通过Ne ...
- AjaxPro实现无刷新更新数据
使用AjaxPro实现无刷新更新数据 需求 在一个页面动态无刷新的更新后台得到的数据.要想无刷新的更新数据,需要使用Javascript能够获取后台返回的数据,然后通过第三方Javascript库(J ...
- .NET MVC4 实训记录之四(Unit of work + Repository)
今日后开启进阶模式! 谈到MVC与EntityFramework,则不得不说一说事务与仓储(Unit of work + Repository). 仓储(Repository):领域对象集合.用于操作 ...
- MVC区域小结
MVC区域小结 MVC区域小结 MVC3一直在学习,项目中有的时候也会用到,博客园也一直逛,想写点什么东西,可惜我这个人平时都很懒,理论层面的东西自己写不来,还是来点实际的简单入门的博客,对自己总结能 ...
- 数据结构队列的java实现,包括线性和链式两种方式
实现的思路为: 采用泛型的方式,首先定义了一个Queue的接口,然后通过实现该接口实现了线性和链式的两种形式的队列: 接口代码如下: package com.peter.java.dsa.interf ...
- asp.net mvc4
select省市联动选择城市 asp.net mvc4 2014-05-24 16:48 by P.C ++, 159 阅读, 2 评论, 收藏, 编辑 本文在 http://www.cnblogs. ...
- c# 如何显示图片指定位置
private void panel1_Paint(object sender, PaintEventArgs e) { Rectangle r1 = new Rectangle(0, 0, 100, ...