一开始用刷表法,每次都要memset,超时了。
然后改成填表法就过了。
AC代码
#include<bits/stdc++.h>
#define maxn 5010
#define INF 0X3F3F3F3F
using namespace std;
char s1[maxn];
char s2[maxn];
int st1[30];
int st2[30];
int ed1[30];
int ed2[30];
int dp[maxn][maxn];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%s%s",s1+1,s2+1);
int l1=strlen(s1+1);
int l2=strlen(s2+1);
memset(st1,INF,sizeof(st1));
memset(st2,INF,sizeof(st2));
memset(ed1,-1,sizeof(ed1));
memset(ed2,-1,sizeof(ed2));
for(int i=1;i<=l1;i++)
{
st1[s1[i]-'A']=min(st1[s1[i]-'A'],i);
ed1[s1[i]-'A']=max(ed1[s1[i]-'A'],i);
}
for(int i=1;i<=l2;i++)
{
st2[s2[i]-'A']=min(st2[s2[i]-'A'],i);
ed2[s2[i]-'A']=max(ed2[s2[i]-'A'],i);
}
for(int i=0;i<=l1;i++)
for(int j=0;j<=l2;j++)
{
int a1,a2;
a1=a2=0;
for(int k=0;k<26;k++)
{
if((st1[k]<=i-1||st2[k]<=j)&&(ed1[k]>i-1||ed2[k]>j)) a1++;
if((st1[k]<=i||st2[k]<=j-1)&&(ed1[k]>i||ed2[k]>j-1)) a2++;
}
if(i==0&&j==0) dp[i][j]=0;
else if(i==0) dp[i][j]=dp[i][j-1]+a2;
else if(j==0) dp[i][j]=dp[i-1][j]+a1;
else dp[i][j]=min(dp[i-1][j]+a1,dp[i][j-1]+a2);
}
printf("%d\n",dp[l1][l2]);
}
return 0;
}
超时的刷表法
#include<bits/stdc++.h>
#define maxn 5010
#define INF 0X3F3F3F3F
using namespace std;
char s1[maxn];
char s2[maxn];
int st1[30];
int st2[30];
int ed1[30];
int ed2[30];
int dp[maxn][maxn];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%s%s",s1+1,s2+1);
int l1=strlen(s1+1);
int l2=strlen(s2+1);
memset(st1,INF,sizeof(st1));
memset(st2,INF,sizeof(st2));
memset(ed1,-1,sizeof(ed1));
memset(ed2,-1,sizeof(ed2));
for(int i=1;i<=l1;i++)
{
st1[s1[i]-'A']=min(st1[s1[i]-'A'],i);
ed1[s1[i]-'A']=max(ed1[s1[i]-'A'],i);
}
for(int i=1;i<=l2;i++)
{
st2[s2[i]-'A']=min(st2[s2[i]-'A'],i);
ed2[s2[i]-'A']=max(ed2[s2[i]-'A'],i);
}
memset(dp,INF,sizeof(dp));
dp[0][0]=0;
for(int i=0;i<=l1;i++)
for(int j=0;j<=l2;j++)
{
int a=0;
for(int k=0;k<26;k++)
if((st1[k]<=i||st2[k]<=j)&&(ed1[k]>i||ed2[k]>j))
a++;
dp[i+1][j]=min(dp[i+1][j],dp[i][j]+a);
dp[i][j+1]=min(dp[i][j+1],dp[i][j]+a);
}
printf("%d\n",dp[l1][l2]);
}
return 0;
}