zoukankan      html  css  js  c++  java
  • 题解 POJ1934 【Trip】

    题目链接:Link

    Problem

    Solution

    经过一番尝试,不难找出使用子序列自动机优化的搜索方法,使得不会搜索重复解。但使用如下代码会发现存在一系列不可描述的问题:

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<string>
    using namespace std;
    int n,m,f[105][105],na[105][26],nb[105][26];
    char a[105],b[105];
    string res[1005]; int cnt;
    void dfs(int i,int j,string s,int nd)
    {
    	if(nd==0) { res[cnt++]=s; return; }
    	if(i>n||j>m) return;
    	if(a[i]==b[j]) dfs(i+1,j+1,s+a[i],nd-1);
    	for(int v=0;v<26;v++)
    		if(f[na[i][v]][nb[j][v]]==nd)
    			dfs(na[i][v],nb[j][v],s,nd);
    }
    int main()
    {
    	#ifdef local
    	freopen("pro.in","r",stdin);
    	#endif
    	scanf("%s%s",a+1,b+1); n=strlen(a+1); m=strlen(b+1);
    	for(int i=n;i>=1;i--)
    		for(int j=m;j>=1;j--)
    		{
    			if(a[i]==b[j]) f[i][j]=max(f[i+1][j+1]+1,max(f[i][j+1],f[i+1][j]));
    			else f[i][j]=max(f[i][j+1],f[i+1][j]);
    		}
    	for(int j=0;j<26;j++) { na[n+1][j]=n+1; nb[m+1][j]=m+1; }
    	for(int i=n;i>=1;i--)
    		for(int j=0;j<26;j++)
    			if(a[i]==j+'a') na[i][j]=i;
    			else na[i][j]=na[i+1][j];
    	for(int i=m;i>=1;i--)
    		for(int j=0;j<26;j++)
    			if(b[i]==j+'a') nb[i][j]=i;
    			else nb[i][j]=nb[i+1][j];
    	dfs(1,1,"",f[1][1]);
    	sort(res,res+cnt);
    	for(int i=0;i<cnt;i++) printf("%s
    ",res[i].c_str());
    	return 0;
    }
    

    比如:会出现dfs(1,1)-->dfs(1,1)
    因此,可对状态做如下调整

    1. f[i][j]=a[i+1~n]与b[j+1~m]的结果
    2. na[i][j]=a[i+1~n]中字符j的前一位

    并对代码做相应调整即可解决问题。

    Code

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<string>
    using namespace std;
    int n,m,f[105][105],na[105][26],nb[105][26];
    char a[105],b[105];
    string res[1005]; int cnt;
    void dfs(int i,int j,string s,int nd)
    {
    	if(nd==0) { res[cnt++]=s; return; }
    	if(i>n||j>m) return;
    	if(a[i]==b[j])
    	{
    		string t=s+a[i];
    		dfs(i+1,j+1,t,nd-1);
    		return;
    	}
    	for(int v=0;v<26;v++)
    		if(f[na[i-1][v]][nb[j-1][v]]==nd)
    			dfs(na[i-1][v]+1,nb[j-1][v]+1,s,nd);
    }
    int main()
    {
    	#ifdef local
    	freopen("pro.in","r",stdin);
    	#endif
    	scanf("%s%s",a+1,b+1); n=strlen(a+1); m=strlen(b+1);
    	for(int i=n;i>=1;i--)
    		for(int j=m;j>=1;j--)
    		{
    			if(a[i]==b[j]) f[i-1][j-1]=f[i][j]+1;
    			else f[i-1][j-1]=max(f[i][j-1],f[i-1][j]);
    		}
    	for(int j=0;j<26;j++) { na[n][j]=n; nb[m][j]=m; }
    	for(int i=n;i>=1;i--)
    		for(int j=0;j<26;j++)
    			if(a[i]==j+'a') na[i-1][j]=i-1;
    			else na[i-1][j]=na[i][j];
    	for(int i=m;i>=1;i--)
    		for(int j=0;j<26;j++)
    			if(b[i]==j+'a') nb[i-1][j]=i-1;
    			else nb[i-1][j]=nb[i][j];
    	dfs(1,1,"",f[0][0]);
    	sort(res,res+cnt);
    	for(int i=0;i<cnt;i++) printf("%s
    ",res[i].c_str());
    	return 0;
    }
    
  • 相关阅读:
    mojo 接口示例
    MojoliciousLite: 实时的web框架 概述
    接口返回json
    centos 6.7 perl 版本 This is perl 5, version 22 安装DBI DBD
    centos 6.7 perl 5.22 安装DBD 需要使用老的perl版本
    商业智能改变汽车行业
    商业智能改变汽车行业
    读MBA经历回顾(上)目的决定手段——北漂18年(48)
    perl 升级到5.20版本
    Group Commit of Binary Log
  • 原文地址:https://www.cnblogs.com/happyZYM/p/11503222.html
Copyright © 2011-2022 走看看