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)