1045. Favorite Color Stripe (30)

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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值