题目网址点击打开链接
dp题目
Sample Input
2
AAABBCY
ABBBCDEEY
GBBY
YRRGB
Sample Output
10
12
dp[i][j] i和j表示上下两个串已经处理了多少个 ,i表示第一个串,j表示第二个
每次拿去 i,j dp[i][j]=min(dp[i][j-1],dp[i-1][j])+res;
res 表示当前拿走的串中,每一个色(色出现的位置)在拿走串里面,颜色总长度就+1;
注意。。。。memset(dp--------)会导致超时。无奈。。。。。
#include <iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int maxn=5000+5;
const int inf=0x3f3f3f;
int col1[30][3];
int col2[30][3];
int dp[maxn][maxn];
int f[maxn][maxn];
int zd(int x,int y)
{
int res=0;
for(int i=0;i<26;i++)
{
if(col1[i][1]<=x&&col2[i][1]<=y)//=
continue;
if((col1[i][0]>x&&col2[i][0]>y)||(col1[i][0]>x&&col2[i][0]==-1)||(col1[i][0]==-1&&col2[i][0]>y))
continue;
res++;
//cout<<i<<endl;
}
return res;
}
int main()
{
int n;
//cout<<inf<<endl;
cin>>n;
string a,b;
while(n--)
{
cin>>a>>b;
memset(col1,-1,sizeof(col1));
memset(col2,-1,sizeof(col2));
// memset(dp,inf,sizeof(dp));
for(int i=0;i<a.size();i++)
{
if(col1[a[i]-'A'][0]<0)
{
col1[a[i]-'A'][0]=i;
col1[a[i]-'A'][1]=i;
}
col1[a[i]-'A'][1]=i;
}
for(int i=0;i<b.size();i++)
{
if(col2[b[i]-'A'][0]<0)
{
col2[b[i]-'A'][0]=i;
col2[b[i]-'A'][1]=i;
}
col2[b[i]-'A'][1]=i;
}
dp[0][0]=0;
int l1=a.size();
int l2=b.size();
// cout<<zd(0,0)<<endl;
for(int i=0;i<=a.size();i++)
{
for(int j=0;j<=b.size();j++)
{
if(j&&i)
dp[i][j]=min(dp[i-1][j],dp[i][j-1])+zd(i-1,j-1);
else
{
if(i)
dp[i][j]=dp[i-1][j]+zd(i-1,j-1);
else if(j)
dp[i][j]=dp[i][j-1]+zd(i-1,j-1);
}
// cout<<zd(i,j)<<endl;
}
}
/*
f[0][0]=0;
for(int i=0;i<=l1;i++)
for(int j=0;j<=l2;j++)
{
f[i][j]=zd(i-1,j-1);
if(i&&j)
f[i][j]+=min(f[i][j-1],f[i-1][j]);
else
{
if(i)
f[i][j]+=f[i-1][j];
else if(j)
f[i][j]+=f[i][j-1];
}
}
printf("%d\n",f[l1][l2]);*/
printf("%d\n",dp[l1][l2]);
}
//cout << "Hello world!" << endl;
return 0;
}
ds