poj-3898 Software Industry Revolution DP
题目链接:
http://poj.org/problem?id=3898
题目意思:
有两个字符串,模式串和原串。每个字母有一个权值,a为1,b为2,...z为26
模式串中‘ ?’可以被一个字母代替。
‘*’可以被0个或多个字母代替。
问替换后的模式串满足时原串的子串,求权值和最小的那个值。
解题思路:
dp[i][j]表示模式串的第i个字符和原串的第j个字符匹配时,能达到的最小的权值。
当save1[i]==save2[j]时,dp[i][j]=min(dp[i][j],dp[i-1][j-1]+save2[j]-'0');
当save1[i]=='*'时,dp[i][j]=min(dp[i][j],dp[i-1][k]+sum[j]-sum[k])(0<=k<=j);
当save1[i]=='?'时,dp[i][j]=min(dp[i][j],dp[i-1][j-1]+save2[j]-'0');
用lmin[j]保存下表示不超过j的最小的dp[i-1][k]-sum[k] 则lmin[j]=min(lmin[j-1],dp[i-1][j]-sum[j]);
用lmin[j]数组可以把复杂度降很多。以后要多加留意呵呵。
代码:
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<list>
#include<queue>
#define eps 1e-6
#define INF 0x1f1f1f1f
#define PI acos(-1.0)
#define ll __int64
#define lson l,m,(rt<<1)
#define rson m+1,r,(rt<<1)|1
using namespace std; /*
freopen("data.in","r",stdin);
freopen("data.out","w",stdout);
*/
int dp[1100][11000];
int sum[11000],lmin[11000];
char save1[1100],save2[11000]; int main()
{
while(scanf("%s%s",save1+1,save2+1)!=EOF)
{
int le1=strlen(save1+1),le2=strlen(save2+1); //printf("%d %d\n",le1,le2);
sum[0]=0;
for(int i=1;i<=le2;i++) //sum[i]表示前i个,权值之和
sum[i]=save2[i]-'a'+1+sum[i-1];
for(int i=0;i<=le1;i++) //初始化为最大
for(int j=0;j<=le2;j++)
dp[i][j]=INF;
dp[0][0]=0;
lmin[0]=INF; //用lmin[j]保存下表示不超过j的最小的dp[i-1][k]-sum[k]
//则lmin[j]=min(lmin[j-1],dp[i-1][j]-sum[j])
for(int i=1;i<=le2;i++)
{
dp[0][i]=0;
lmin[i]=min(lmin[i-1],dp[0][i]-sum[i]);
}
bool flag=false;
for(int i=1;i<=le1;i++)
{
lmin[0]=INF;
flag=false;
if(dp[i-1][0]==0) //说明前面有‘*’号的情况
{
if(save1[i]=='*')
{
dp[i][0]=0;
flag=true; //注意这个不能掉
}
}
for(int j=1;j<=le2;j++)
{
if(save1[i]=='?') //当为?号时,可以用任意字母代替
{
if(dp[i-1][j-1]+save2[j]-'a'+1<dp[i][j])
{
flag=true;
dp[i][j]=dp[i-1][j-1]+save2[j]-'a'+1;
}
}
else if(save1[i]=='*') //当为‘*’时,找到lmin[j],用它来更新
{
if(lmin[j]+sum[j]<dp[i][j])
{
flag=true;
dp[i][j]=lmin[j]+sum[j];
}
}
else if(save1[i]==save2[j]) //直接更新过来
{
if(dp[i-1][j-1]+save2[j]-'a'+1<dp[i][j])
{
dp[i][j]=dp[i-1][j-1]+save2[j]-'a'+1;
flag=true;
}
}
lmin[j]=min(lmin[j-1],dp[i][j]-sum[j]);
//printf("i:%d j:%d %d ",i,j,dp[i][j]);
}
if(!flag) //减一下枝
break;
//putchar('\n');
}
int ans=INF;
for(int j=1;j<=le2;j++)
ans=min(ans,dp[le1][j]);
if(ans==INF)
puts("-1");
else
printf("%d\n",ans);
} return 0;
}
poj-3898 Software Industry Revolution DP的更多相关文章
- {POJ}{3988}{Software Industry Revolution}{DP好题}
题意:给定一个字符串d,要求用另一字符串s去匹配,其中s中的?可以为任何字符,*可以为任意个字符,求最小的匹配权值 思路:这题和CSDN英雄会的“反相互”类似,由于其中某些字符的不确定性,利用动态规划 ...
- 【POJ 3071】 Football(DP)
[POJ 3071] Football(DP) Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4350 Accepted ...
- poj 3311(状态压缩DP)
poj 3311(状态压缩DP) 题意:一个人送披萨从原点出发,每次不超过10个地方,每个地方可以重复走,给出这些地方之间的时间,求送完披萨回到原点的最小时间. 解析:类似TSP问题,但是每个点可以 ...
- poj 1185(状态压缩DP)
poj 1185(状态压缩DP) 题意:在一个N*M的矩阵中,‘H'表示不能放大炮,’P'表示可以放大炮,大炮能攻击到沿横向左右各两格,沿纵向上下各两格,现在要放尽可能多的大炮使得,大炮之间不能相互 ...
- poj 3254(状态压缩DP)
poj 3254(状态压缩DP) 题意:一个矩阵里有很多格子,每个格子有两种状态,可以放牧和不可以放牧,可以放牧用1表示,否则用0表示,在这块牧场放牛,要求两个相邻的方格不能同时放牛,即牛与牛不能相 ...
- poj 2324 Anniversary party(树形DP)
/*poj 2324 Anniversary party(树形DP) ---用dp[i][1]表示以i为根的子树节点i要去的最大欢乐值,用dp[i][0]表示以i为根节点的子树i不去时的最大欢乐值, ...
- Poj 1973 Software Company(二分+并行DP)
题意:软件公司接了两个项目,来自同一个合同,要一起交付.该公司有n个程序猿来做这两个项目A和B,每个项目都被分为m个子项目,给定每个程序猿做一个A中的子项目需要的时间Xi秒,和做B中的子项目所需时间Y ...
- Software Industry Revolution----POJ3898----DP
题目地址:http://poj.org/problem?id=3898 题目意思: 给你一个模式串,再给你一个原串,要你去匹配 模式串里面的?可对应任意一个字符 *号可对应0个或多个字符 其中a=1, ...
- POJ 2096 Collecting Bugs 期望dp
题目链接: http://poj.org/problem?id=2096 Collecting Bugs Time Limit: 10000MSMemory Limit: 64000K 问题描述 Iv ...
随机推荐
- 对JSON数组对象排序-有键相同的元素,分组数量不一致,可采用如下的JS进行循环表格输出
var now=eval(data.data); // now.sort(sortBy('bigIdOrder', true, parseInt)); var tab=""; va ...
- jquery+html三级联动下拉框及详情页面加载时的select初始化问题
html写的三个下拉框,如下: <select name="ddlQYWZYJ" id="ddl_QYWZYJ" class="fieldsel ...
- PHP 3:从Login界面谈PHP标记
原文:PHP 3:从Login界面谈PHP标记 前一篇文章简要介绍了此实例.OK,我们就从第一个页面Login页面入手吧.还是看看界面怎么样,是不是很想指导它到底是如何实现的呢?好的,看看其代码吧: ...
- hdu5024(dp)
意甲冠军: 薛期呵和王熙凤不想很接近生活(因为假定他们一起,柴可能取代王熙凤) 现在'.'事情是这样的.'#'一堵墙.薛期呵对宝让生活远: 因此,选择一个最长的公路,让他们住在两端: 路达一个转折点. ...
- jQuery EasyUI API - Layout - Layout[原创汉化官方API]
最近在学习jQuery EasyUI,发现中文的文档好少,部分文档不错但它是鸟语的,为了大家也为了自己学习吧,汉化做一下笔记. 有没有说清楚的,或者翻译不正确的地方还请大家谅解指出.. 由于工作时间原 ...
- 四种方案:将OpenStack私有云部署到Hadoop MapReduce环境中
摘要:OpenStack与Hadoop被誉为继Linux之后最有可能获得巨大成功的开源项目.这二者如何结合成为更猛的新方案?业内给出两种答案:Hadoop跑在OpenStack上或OpenStack部 ...
- phpcms 模板常用标签指南
1.关于SEO <meta name="keywords" content="{$SEO[keyword]}"/> <meta name=&q ...
- 个推A/B测试评测
A/B测试在各类网站设计中已经是比较常见的,本文着重讲讲A/B测试在应用推送领域的作用. 目前国外开通A/B测试的推送服务商只有swrve,而国内的个推也在前不久发布的smart push 2.0中集 ...
- Bootstrap+Knockout.JS+ASP.Net MVC3+PetaPOCO实现CRUD操作
Bootstrap+Knockout.JS+ASP.Net MVC3+PetaPOCO实现CRUD操作 1.需求: 1.1)页面要美观大气 1.2)前端代码要简洁清晰,要用MVC或是MVVM框架 1. ...
- Javascript多线程引擎(三)
Javascript多线程引擎(三) 完成对ECMAScript-262 3rd规范的阅读后, 列出了如下的限制条件 1. 去除正则表达式( 语法识别先不编写) 2. 去除对Function Decl ...