1045. Favorite Color Stripe (30)
method:转化为最长有序子序列问题。
fcolar[i]:表示颜色i(i>=1)在Eva喜爱的颜色列表中的第fcolar[i]位置,例如对于favorite[]=(2,3,1,5,6),fcolar[]=(3,1,2,0,5,6); (fcolar[favorite[i]]=i, 其中颜色4不在favorite列表中,所以fcolar[4]=0)
strp[i]:表示original stripe在Eva喜爱的颜色列表中的位置序列(剔除了不在favorite列表中的颜色),例如初始颜色序列oristrp[]=(2,2,4,1,5,5,6,3,1,1,5,6),strp[]=(1,1,0,3,5,5,6,2,3,3,5,6);(strp[i]=fcolar[oristrp[i]]),最后需要剔除strp[]中的0元素,即strp[]=(1,1,3,5,5,6,2,3,3,5,6)。
最后问题被转化为求strp的最长有序子序列长度,代码如下:
#include <stdio.h>
class CA
{
public:
enum{max_col=201,L=10000};
int colnum,fcolnum,fcolar[max_col],strpnum,strp[L],l,f[L];
void run();
};
void CA::run()
{
int i,j,t,r,maxf=1;
scanf("%d",&colnum);
for(i=1;i<=colnum;i++) fcolar[i]=0;
scanf("%d",&fcolnum);
for(i=1;i<=fcolnum;i++)
{
scanf("%d",&t);
fcolar[t]=i;
}
scanf("%d",&strpnum);
l=0;
for(i=0;i<strpnum;i++)
{
scanf("%d",&t);
if(fcolar[t]>0) strp[l++]=fcolar[t];
}
for(i=0;i<l;i++) f[i]=1; //f[k]为以k结尾的最长有序子序列
for(i=1;i<l;i++)
{
for(j=0;j<i;j++)
{
if(strp[i]>=strp[j]&&f[i]<f[j]+1)
{
f[i]=f[j]+1;
if(f[i]>maxf) maxf=f[i];
}
}
}
printf("%d\n",maxf);
}
int main()
{
// freopen("test.in","r",stdin);
CA *a=new CA;
a->run();
return 0;
}