1045 Favorite Color Stripe(LCS解法) 需再理解

Posted CSU迦叶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1045 Favorite Color Stripe(LCS解法) 需再理解相关的知识,希望对你有一定的参考价值。

解题思路

使用LCS方法解这一题,首先要把现有的颜色和Eva的颜色看成即将取材的序列s和e。

而且注意2个序列都要从1开始读入,因为递归边界(待后叙)。

dp[i][j]代表的是e[1]-e[i]和s[1]-s[j]的范围内,公共子序列的长度。

递归边界设置如下

for(int i=0;i<=EvaN;i++){
	dp[i][0] = 0;
}
for(int i=0;i<=colorN;i++){
	dp[0][i] = 0;
}

真正开始动态规划的时候,i和j的下标都是从1开始的

至于状态转移方程,这题由于相当于e中元素可以重复,所以不再是根据基础的LCS公式来,至于为什么是这个样子,我现在也不清楚。但是这题似乎用那种一维固定一维变化的思路来想是想不出来的

不可以重复的话,即基础的LCS,是这样转移的

for(int i=1;i<=EvaN;i++){
	for(int j=1;j<=colorN;j++){
		if(e[i]==s[j])dp[i][j] = dp[i-1][j-1] + 1;
		else dp[i][j] = max(dp[i][j-1],dp[i-1][j]);
	}
}

本题是这么转移的

for(int i=1;i<=EvaN;i++){
	for(int j=1;j<=colorN;j++){
		if(e[i]==s[j])dp[i][j] = max(dp[i][j-1],dp[i-1][j]) + 1;
		else dp[i][j] = max(dp[i][j-1],dp[i-1][j]);
	}
}

AC代码

#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<bits/stdc++.h>
using namespace std;

const int INF = 1000000000;//10的9次方 
const int maxn = 10010;
const double eps = 1e-3;

int type,colorN,EvaN;//感觉type是无用的 
int e[maxn];
int s[maxn];
int dp[maxn][maxn];//第一维对应数组e[] 


int main(){
	
	scanf("%d %d",&type,&EvaN);
	
	//读入e[]
	for(int i=1;i<=EvaN;i++){
		scanf("%d",&e[i]);
	}
	
	scanf("%d",&colorN);
	//读入s[]
	for(int i=1;i<=colorN;i++){
		scanf("%d",&s[i]);
	}
	
	//设置递归边界
	for(int i=0;i<=EvaN;i++){
		dp[i][0] = 0;
	}
	for(int i=0;i<=colorN;i++){
		dp[0][i] = 0;
	}
	
	
	for(int i=1;i<=EvaN;i++){
		for(int j=1;j<=colorN;j++){
			if(e[i]==s[j])dp[i][j] = max(dp[i][j-1],dp[i-1][j]) + 1;
			else dp[i][j] = max(dp[i][j-1],dp[i-1][j]);
		}
	}	
	
	printf("%d\\n",dp[EvaN][colorN]);
	
	return 0; 
}

以上是关于1045 Favorite Color Stripe(LCS解法) 需再理解的主要内容,如果未能解决你的问题,请参考以下文章

PAT 1045. Favorite Color Stripe

PAT 1045. Favorite Color Stripe (30)

1045. Favorite Color Stripe (30)-PAT甲级真题

1045 Favorite Color Stripe (最长不下降子序列 LIS)

[pat]1045 Favorite Color Stripe

1045 Favorite Color Stripe(LIS解法)