zoukankan      html  css  js  c++  java
  • {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
    ",ans);
    	}
    }
    
    int main()
    {
    	Solve();
    	return 0;
    }
    
  • 相关阅读:
    UML第一次编程作业
    css文本属性
    css文字属性
    Qobject设置对象名称和属性
    m3u8
    easyUI tree jQuery
    easyUI layout
    正则表达式
    Spring mvc 数据验证框架注解
    blur和click事件的先后顺序问题
  • 原文地址:https://www.cnblogs.com/lvpengms/p/3930168.html
Copyright © 2011-2022 走看看