1045. Favorite Color Stripe

自己写得有2个case超时了:

#include <stdio.h>
#include <string.h>

int n,m,l;
int fav[200+5];//favorite
int stripe[10000+5];

int map[10000+5];//HashMap 从stripe[]到其在fav中对应的下标,没有的话设为-1
int maxLen = 0;

void f(int len , int idx, int curFav){//len:当前长度;idx:遍历stripe的下标;curFav:当前favorite在fav[]中的下标

	//test
	//printf("idx = %d len = %d\n\n",idx,len);

	if(idx == l){//走到末尾
		maxLen = len > maxLen ? len : maxLen;
		return;
	}
	
	
	int color = stripe[idx];

	if(color == fav[curFav]){//当前stripe[inx]是favorite,且对应fav的下标与curFav 一致		
		f(len+1,idx+1,curFav);
	}else {//  

		f(len, idx+1, curFav);//仍然维持curFav不变, 不管当前color是不是favorite

			 

		if(map[color] > curFav+1){
			f(len+1, idx+1, map[color]-1);	//更新curFav
		} 
		
	}

}


int main(){
	freopen("in.txt","r",stdin);
	scanf("%d",&n);
	scanf("%d",&m);

	//memset(colorIsFav,0,m);

	memset(map, 0, sizeof(map));

	for(int i = 0; i < m; i++){
		int tmp;
		scanf("%d",&tmp);
		fav[i] = tmp;
		 

		map[tmp] = i+1;//根据clolor 值找其在fav[]中的下标, 下标从1开始
	}

	scanf("%d",&l);
	for(int i = 0; i < l; i++){
		scanf("%d",&stripe[i]);
	}

	f(0,0,0);

	printf("%d",maxLen);

	return 0;
}

然后ref:

http://tech-wonderland.net/blog/pat-1045-favorite-color-stripe.html

这是个fucking DP问题,而且稍微有点不同的是:

	if(fav[x-1] == stripe[y-1]){//当前元素相等
		dp[x][y-1] = fill(x,y-1);//由于fav[x]可以重复出现在stripe[y]中, 所以求dp[x][y-1]
		dp[x][y] = dp[x][y-1] + 1;

参考了一点DP的科普:

http://blog.csdn.net/v_JULY_v/article/details/6110269

#include <stdio.h>
#include <string.h>

int n,m,l;
int fav[200+5];//favorite
int stripe[10000+5];

int dp[200+5][10000+5];//dp[i][j]存储fav[i]和stripe[j]的LCS长度

int fill(int x, int y){//把给dp赋值与求dp[m][l]放进一个函数里
	if(x == 0 || y ==0){//任何串与空串的LCS 为空
		dp[x][y] = 0;
		return 0;
	}

	if(dp[x][y] != -1){//已经求过值了
		return dp[x][y];
	}

	if(fav[x-1] == stripe[y-1]){//当前元素相等
		dp[x][y-1] = fill(x,y-1);//由于fav[x]可以重复出现在stripe[y]中, 所以求dp[x][y-1]
		dp[x][y] = dp[x][y-1] + 1; 
	}else{
		
		dp[x-1][y] = fill(x-1,y);		
		dp[x][y-1] = fill(x,y-1);

		dp[x][y] = dp[x-1][y] > dp[x][y-1] ? dp[x-1][y] : dp[x][y-1];
	}
	return dp[x][y];
}
 

int main(){
	freopen("in.txt","r",stdin);
	scanf("%d",&n);
	scanf("%d",&m);

	for(int i = 0; i < m; i++){
		int tmp;
		scanf("%d",&tmp);
		fav[i] = tmp;
	}

	scanf("%d",&l);
	for(int i = 0; i < l; i++){
		scanf("%d",&stripe[i]);
	}

	for(int i = 0; i <= m; i++){//初始化为-1
		for(int j = 0; j <= l; j++){
			dp[i][j] = -1;
		}
	}
	

	printf("%d",fill(m,l));

	return 0;
}




你可能感兴趣的:(1045. Favorite Color Stripe)