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

题意:给定一个字符串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;
}
时间: 2024-10-25 08:41:18

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

POJ 1947 Rebuilding Roads (树形dp 经典题)

Rebuilding Roads Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 9499   Accepted: 4317 Description The cows have reconstructed Farmer John's farm, with its N barns (1 <= N <= 150, number 1..N) after the terrible earthquake last May. The

POJ 2342 Anniversary party (树形dp 入门题)

Anniversary party Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4810   Accepted: 2724 Description There is going to be a party to celebrate the 80-th Anniversary of the Ural State University. The University has a hierarchical structure

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

Apple Tree Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7784   Accepted: 2603 Description Wshxzt is a lovely girl. She likes apple very much. One day HX takes her to an apple tree. There are N nodes in the tree. Each node has an amoun

POJ 2955:Brackets 区间DP基础题

Brackets 题目链接: http://poj.org/problem?id=2955 题意: 给出一个只由'('.')'.'['.']'构成的字符串,字符间可以匹配,左边的 '(' 可以与右边的 ')' 匹配,左边的 '[' 可以与右边的 ']' 匹配 两种匹配不能交叉,可以包含,如 [(])只算2个匹配而[()]算四个匹配,求最大匹配数. 题解: 设dp[i][j]为区间 i 到 j (设len为区间长度,j=i+len)内可以得到的最大匹配数,则有两种情况: ① j 不与区间[i,j]

POJ 2342 Anniversary party 树形DP基础题

题目链接:http://poj.org/problem?id=2342 题目大意:在一个公司中,每个职员有一个快乐值ai,现在要开一个party,邀请了一个员工就不可能邀请其直属上司,同理邀请了一个人就不可以邀请其的直属员工, 问如何使得这个快乐值达到最大. 题解:对每个结点dp[i][0]表示不邀请这个员工,其子树达到的最大快乐值,dp[i][1]表示邀请i员工其子树达到的最大值. dp[i][0]=(i的全部员工的max(dp[u][1],dp[u][0)相加,也就是其子员工来或不来的最大快

poj 1276 Cash Machine(dp 水题)

Language: Default Cash Machine Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 27799   Accepted: 9913 Description A Bank plans to install a machine for cash withdrawal. The machine is able to deliver appropriate @ bills for a requested c

POJ 2411 &amp;&amp; HDU 1400 Mondriaan&#39;s Dream (状压dp 经典题)

Mondriaan's Dream Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 12341   Accepted: 7204 Description Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One night, after producing the drawings in his 'toilet series

poj 3254 状压dp入门题

1.poj 3254  Corn Fields    状态压缩dp入门题 2.总结:二进制实在巧妙,以前从来没想过可以这样用. 题意:n行m列,1表示肥沃,0表示贫瘠,把牛放在肥沃处,要求所有牛不能相邻,求有多少种放法. #include<iostream> #include<cstring> #include<cmath> #include<queue> #include<algorithm> #include<cstdio> #d

POJ 3342 树形DP入门题

题目意思和POJ2342一样,只是多加了一个条件,如果最大方案数唯一,输出Yes,不唯一输出No dp的是时候多加一个变量记录答案是否唯一即可 #include "stdio.h" #include "string.h" #include "vector" using namespace std; struct node { int fa; vector<int>child; }data[210]; struct comp { int