简单DP,dp[i][j]表示从第一个序列里取出i个和从第j个序列里取出j个的组合的最小值,可以从两个方向转移过来,每次转移加上已经出现过的且还没有出现完的字母的个数. O(n∗m) 的复杂度.
Cars painted in different colors are moving in a row on the road as shown in Figure 1. The color of each
car is represented by a single character and the distance of two adjacent cars is assumed to be 1. Figure
1 shows an example of such cars on the road. For convenience, the numbers in Figure 1 represent the
locations of each car.
Figure 1. Cars in different colors on the road
For any color c, location(c) represents set of the locations of the cars painted in color c and color
length L(c) is defined as follows:
L(c) = max location(c) − min location(c)
For example, according to Figure 1, location(G) = {1, 5, 6}, location(Y ) = {2, 7}, location(B) =
{3}, and location(R) = {4, 8}. Hence the color length of each color and the sum of the color lengths
are as follows.
Color G Y B R Sum
L(c) 5 5 0 4 14
In Gyeongju City, almost all the roads including the main street of the city were constructed more
than 500 years ago. The roads are so old that there are a lot of puddles after rain. Visitors have
complained about the bad condition of the roads for many years. Due to the limited budget, the mayor
of the city decided to repair firstly the main street of the city, which is a four-lane road, two lanes for
each direction.
However, since the main street is a backbone of the city, it should not be blocked completely while
it is under repair, or it is expected that serious traffic jams will occur on almost all the other roads in
the city. To allow cars to use the main street during the repair period, the city decided to block only
two lanes, one lane for each direction. Hence, the cars in the two lanes for each direction should merge
into a single lane before the blocked zone.
For instance, as shown in Figure 2, cars in the two lanes merge into a single lane as shown in Figure
3. To differentiate the cars in the same color, a unique identifier is assigned to each car.
Figure 2. Cars moving in two lanes before mergingUniversidad de Valladolid OJ: 1625 – Color Length 2/2
Figure 3 shows two different merging scenarios after merging the cars from the two lanes. As shown
in Figure 3, cars in the two lanes do not necessarily merge one by one from each lane. The distance
between two adjacent cars after merging is also assumed 1.
After merging (Scenario 1):
After merging (Scenario 2):
Figure 3. Two different merging scenarios
For each merging scenario shown in Figure 3, the color length for each color and the sum of the
color lengths are as follows:
Color G Y B R Sum
L(c): Scenario 1 7 3 7 2 19
L(c): Scenario 2 1 7 3 1 12
As you can imagine, there are many different ways of merging other than the two examples shown
in Figure 3.
Given two character strings which represent the color information of the cars in the two lanes before
merging, write a program to find the sum of color lengths obtained from the character string, which is
the color information of cars after merging, such that the sum of color lengths is minimized.
Your program is to read from standard input. The input consists of T test cases. The number of test
cases T is given in the first line of the input. Each test case consists of two lines. In the first line, a
character string of length n (1 ≤ n ≤ 5, 000) that is the color information of the cars in one lane before
merging is given. In the second line, a character string of length m (1 ≤ m ≤ 5, 000) that is the color
information of the cars in the other lane is given. Every color is represented as an uppercase letter in
English, hence the number of colors is less than or equal to 26.
Your program is to read from standard input. Print exactly one line for each test case. The line should
contain the sum of color lengths after merging the cars in the two lanes optimally as described above.
The following shows sample input and output for two test cases.
2
AAABBCY
ABBBCDEEY
GBBY
YRRGB
10
12
/* *********************************************** Author :CKboss Created Time :2015年02月09日 星期一 15时27分59秒 File Name :UVA1625.cpp ************************************************ */
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <cmath>
#include <cstdlib>
#include <vector>
#include <queue>
#include <set>
#include <map>
using namespace std;
const int maxn=5999;
const int INF=0x3f3f3f3f;
char str1[maxn],str2[maxn];
int n,m;
int sum[30],ns[2][maxn][30];
int dp[maxn][maxn];
void init()
{
memset(sum,0,sizeof(sum));
for(int i=0;i<n;i++)
{
int c=str1[i]-'A';
sum[c]++;
for(int j=0;j<30;j++)
ns[0][i+1][j]=ns[0][i][j];
ns[0][i+1][c]++;
}
for(int i=0;i<m;i++)
{
int c=str2[i]-'A';
sum[c]++;
for(int j=0;j<30;j++)
ns[1][i+1][j]=ns[1][i][j];
ns[1][i+1][c]++;
}
}
bool check(int c,int i,int j)
{
int sum1=ns[0][i][c];
int sum2=ns[1][j][c];
int sum3=sum1+sum2;
if(sum3<=0) return false;
else if(sum3==sum[c]) return false;
return true;
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int T_T;
scanf("%d",&T_T);
while(T_T--)
{
scanf("%s%s",str1,str2);
n=strlen(str1); m=strlen(str2);
init();
/// DP
for(int i=0;i<=n;i++)
{
for(int j=0;j<=m;j++)
{
int temp=0;
for(int k=0;k<30;k++)
if(check(k,i,j)) temp++;
if(i-1>=0&&j-1>=0)
dp[i][j]=min(dp[i-1][j],dp[i][j-1])+temp;
else if(i-1>=0&&j-1<0)
dp[i][j]=dp[i-1][j]+temp;
else if(i-1<0&&j-1>=0)
dp[i][j]=dp[i][j-1]+temp;
}
}
printf("%d\n",dp[n][m]);
}
return 0;
}