您的位置:首页 > 其它

UVa 1625

2016-07-22 22:07 274 查看
#include<cstdio>
#include<cstring>
#include<algorithm>

using namespace std;

const int maxn=5050;
const int INF=0x3f3f3f3f;
int t,n,m;
char a[maxn],b[maxn];
int dp[maxn][maxn];
int s1[27],e1[27],s2[27],e2[27];

int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%s%s",a+1,b+1);
int len1=strlen(a+1);
int len2=strlen(b+1);
for(int i=0;i<26;i++)
{
s2[i]=s1[i]=INF;
e2[i]=e1[i]=0;
}
int temp;
for(int i=1;i<=len1;i++)
{
temp=a[i]-'A';
if(s1[temp]==INF) s1[temp]=i;//第temp个字母的起始位置
e1[temp]=i;//第temp个字母的末位置
}

for(int i=1;i<=len2;i++)
{
temp=b[i]-'A';
if(s2[temp]==INF) s2[temp]=i;
e2[temp]=i;
}

for(int i=0;i<=len1;i++)
{
for(int j=0;j<=len2;j++)
{
int cnt=0,res=INF;
for(int k=0;k<26;k++)
{
if((i>=s1[k]||j>=s2[k])&&(i<e1[k]||j<e2[k]))//和前面的初始化相对应,这就是为什么初始化要e为0,而s为无穷大的原因了。
cnt++;
}
if(i>0) res=min(res,dp[i-1][j]);
if(j>0) res=min(res,dp[i][j-1]);
dp[i][j]=cnt+(res==INF ? 0:res);
}
}
printf("%d\n",dp[len1][len2]);
}
return 0;
}
这个题真的是非常的难啊,完全做不出来,看了题解 再自己模拟才慢慢明白了什么意思,这个还是要模拟一下才明白所说的新增的元素每次使得原有的幸存的元素+1,也就是位置查加1,这个需要好好理解啊,收获很大,这个算法还是很厉害的,膜拜啊。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: