您的位置:首页 > 其它

Color Length UVA - 1625

2017-07-09 10:05 316 查看
紫书上的题目,讲解的很清楚,附代,以后要仔细思考.

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int c[5010][5010];
int dp[5010][5010];
char s1[5010];
char s2[5010];
int p[5010];
int q[5010];
int py[5010];
int qy[5010];
int px[5010];
int qx[5010];
int main()
{
int T;
scanf("%d", &T);
while(T--)
{
scanf("%s %s",s1+1,s2+1);
int len1 = strlen(s1+1);
int len2 = strlen(s2+1);
for(int i=1; i<=len1; i++) s1[i] -= 'A';
for(int i=1; i<=len2; i++) s2[i] -= 'A';
for(int i=0; i<26; i++)
{
px[i] = qx[i] = 99999;
py[i] = qy[i] = 0;
}
for(int i=1; i<=len1; i++)
{
px[s1[i]] = min(px[s1[i]],i);
py[s1[i]] = i;
}
for(int i=1; i<=len2; i++)
{
qx[s2[i]] = min(qx[s2[i]],i);
qy[s2[i]] = i;
}
//memset(c, 0, sizeof(c));
c[0][0] = 0;
dp[0][0] = 0;
for(int i=0; i<=len1; i++)
{
for(int j=0; j<=len2; j++)
{
int v1 = 99999;
int v2 = 99999;
if(i==0 && j==0)continue;
if(i) v1 = dp[i-1][j] + c[i-1][j];
if(j) v2 = dp[i][j-1] + c[i][j-1];
dp[i][j] = min(v1,v2);
if(i)
{
c[i][j] = c[i-1][j];
if(i==px[s1[i]] && j<qx[s1[i]])c[i][j]++;
if(i==py[s1[i]] && j>=qy[s1[i]])c[i][j]--;
}
else if(j)
{
c[i][j] = c[i][j-1];
if(j==qx[s2[j]] && i < px[s2[j]])c[i][j]++;
if(j==qy[s2[j]] && i >=py[s2[j]])c[i][j]--;
}
}
}
printf("%d\n", dp[len1][len2]);
}
return 0;
}

水波.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  dp