UVA 10029

  题意:给定一个字典,找出连续变换的最长路径。

  思路:我只想说LIS不超时啊,只需要预处理求出每个字符串长度就ok了。

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
char e[25010][17];
int dp[25010]={0},l[25010];
bool ji(int pi,int pj,int li,int lj)
{
	bool yes=true;
	for(int i=0,j=0;i<li;i++,j++){
		if(e[pi][i]==e[pj][j]) continue;
		else if(!yes) return false;
		else {yes=!yes;j--;}
	}
	return true;
}
bool jc(int pi,int pj,int li,int lj)
{
	bool yes=true;
	for(int i=0;i<li;i++){
		if(e[pi][i]==e[pj][i]) continue;
		else if(!yes) return false;
		else yes=!yes;
	}
	return true;
}
bool jd(int pi,int pj,int li,int lj)
{
	bool yes=true;
	for(int i=0,j=0;j<lj;i++,j++){
		if(e[pi][i]==e[pj][j]) continue;
		else if(!yes) return false;
		else {yes=!yes;i--;}
	}
	return true;
}
int main()
{
	//freopen("in.txt","r",stdin);
	int size=0;
	while(cin.getline(e[size],17)) size++;
	for(int i=0;i<size;i++) l[i]=strlen(e[i]);
	int ans=0;
	for(int i=0;i<size;i++){
		int t=0;
		for(int j=0;j<i;j++){
			if(l[i]==l[j]+1&&ji(i,j,l[i],l[j])) t=max(t,dp[j]);
			else if(l[i]==l[j]&&jc(i,j,l[i],l[j])) t=max(t,dp[j]);
			else if(l[i]==l[j]-1&&jd(i,j,l[i],l[j])) t=max(t,dp[j]);
		}
		dp[i]=t+1;
		ans=max(ans,t+1);
	}
	cout<<ans<<endl;
	return 0;
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值