1045. Favorite Color Stripe (30)

原创 2015年11月20日 20:32:24

1.这个和最长公共子序列问题相类似(LCS)

2.不同的地方是允许元素重复,如{a}和{aaa},匹配出来的是3,a可以重复3次

3.该问题一开始卡在了输入格式上

4.动态规划方程:dp[i][j]表示f[0~i]与o[0~j]匹配的最大长度

如果f[i]==o[j],dp[i][j]=max(dp[i][j-1]+1,dp[i-1][j-1]),当目前颜色相同,在上一个的基础上+1(表示上一次已经使用f[i]进行匹配),或者在dp[i-1][j-1]上+1(表示这次才开始使用f[i]作为匹配);

如果f[i]!=o[j],dp[i][j]=max(dp[i][j-1],dp[i-1][j]),当目前的颜色不相同,那么选取dp[i][j-1](f[i]已经进行匹配)和dp[i-1][j](f[i]未进行匹配)的最大值。


5.还有一种最简单的方法:dp[i][j]=max(dp[i-1][j],dp[i][j-1],dp[i-1][j-1]),如果f[i]==o[j],则dp[i][j]++:(采用了LCS的思想)


简单方法的AC代码:

//#include<string>
//#include <iomanip>
#include<vector>
#include <algorithm>
//#include<stack>
#include<set>
#include<queue>
#include<map>
//#include<unordered_set>
#include<unordered_map>
//#include <sstream>
//#include "func.h"
//#include <list>
#include<stdio.h>
#include<iostream>
#include<string>
#include<memory.h>
#include<limits.h>
using namespace std;
/*
6
5 2 3 1 5 6
12 2 2 4 1 5 5 6 3 1 1 5 6

6
5 2 3 1 5 6
10 2 2 3 1 3 1 3 1 3 1

6
5 2 3 1 5 6
10
5 6 6 6 6 6 6 6 6 6 6

6
5 2 3 1 5 6
10 
2 6 6 6 6 6 6 6 6 6 6


6
5 2 3 1 5 6
10
2 2 2 6 6 6 6 6 6 6 6

6
5 2 3 1 5 6
10
2 2 2 6 6 6 6 5 6 6 6

6
5 2 3 1 5 6
10
2 2 2 6 6 6 6 6 5 6 6
*/
int main(void)
{
	int colourSum,fnum, onum;
	cin >> colourSum>> fnum;
	vector<int> f(fnum);
	for (int i = 0; i<fnum; i++)
	{
		scanf("%d", &f[i]);
	}
	cin >> onum;
	vector<int> o(onum);

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

	vector<vector<int>> dp(fnum+1, vector<int>(onum+1,0));

	int thisMax = 0;
	for (int i = 1; i<=f.size(); i++)
	{
		for (int j = 1; j<=o.size(); j++)
		{
			dp[i][j] = max(max(dp[i - 1][j], dp[i][j - 1]), dp[i-1][j-1]);
			if (f[i-1] == o[j-1])
				dp[i][j]++;
		}
	}
	cout << dp[fnum][onum] << endl;
	return 0;
}

第一种方法AC代码:

//#include<string>
//#include <iomanip>
#include<vector>
#include <algorithm>
//#include<stack>
#include<set>
#include<queue>
#include<map>
//#include<unordered_set>
#include<unordered_map>
//#include <sstream>
//#include "func.h"
//#include <list>
#include<stdio.h>
#include<iostream>
#include<string>
#include<memory.h>
#include<limits.h>
using namespace std;
/*
6
5 
2 3 1 5 6
12 2 2 4 1 5 5 6 3 1 1 5 6

4
5 
2 3 1 5 6
10 2 2 3 1 3 1 3 1 3 1

2
5 
2 3 1 5 6
10
5 6 6 6 6 6 6 6 6 6 6

2
5 
2 3 1 5 6
10
2 6 6 6 6 6 6 6 6 6 6


2
5 
2 3 1 5 6
10
2 2 2 6 6 6 6 6 6 6 6
*/
int main(void)
{
	int colorSum,fnum, onum;
	cin >> colorSum>> fnum;
	vector<int> f(fnum);
	for (int i = 0; i<fnum; i++)
	{//输入喜欢的颜色
		scanf("%d", &f[i]);
	}
	cin >> onum;
	vector<int> o(onum);

	for (int i = 0; i<onum; i++)
	{//输入源材料
		scanf("%d", &o[i]);
	}

	vector<vector<int>> dp(fnum, vector<int>(onum));
	for (int i = 0; i<f.size(); i++)
	{//初始化边界数组
		if (f[i] == o[0])
			dp[i][0] = 1;
		else if (i == 0)
			dp[i][0] = 0;
		else
			dp[i][0] = dp[i - 1][0];
	}

	for (int i = 0; i<f.size(); i++)
	{
		for (int j = 1; j<o.size(); j++)
		{
			if (f[i] == o[j])
			{//如果相等,那么dp[i][j]由dp[i][j-1]和dp[i-1][j-1]的最大值构成
				if (i != 0)
					dp[i][j] = max(dp[i][j - 1] + 1, dp[i - 1][j - 1] + 1);
				else
					dp[i][j] = dp[i][j - 1] + 1;
			}
			else
			{
				if (i != 0)
					dp[i][j] = max(dp[i][j - 1], dp[i - 1][j]);//取包含上一个f的长度和不包含上一个f的长度两者最大值
				else
					dp[i][j] = dp[i][j - 1];
			}
		}
	}
	cout << dp[fnum - 1][onum - 1] << endl;
	return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

1045. Favorite Color Stripe (30) -LCS允许元素重复

题目如下: Eva is trying to make her own color stripe out of a given one. She would like to keep o...

【PAT 1045】 Favorite Color Stripe 最长公共子序列LCS

1045. Favorite Color Stripe (30) 时间限制 200 ms 内存限制 32000 kB 代码长度限制 ...

1045. Favorite Color Stripe (30)

题目链接:http://www.patest.cn/contests/pat-a-practise/1045 题目: 时间限制 200 ms 内存限...

pat1045Favorite Color Stripe (30)

题意分析: (1)给出一个有若干个数的偏好序列,同时给出另一个任意的数组,并且参照前面序列中元素出现的相对顺序(某些元素可以丢弃)依次从前往后选择数组中的元素组成一个新的数组,求这个数组的最大长度。 ...

1045. Favorite Color Stripe (30)

考察最长非连续子序列,有点变种 #include #include #include #include using namespace std; int n, m, l; typedef stru...

PAT (Advanced Level) Practise 1045 Favorite Color Stripe (30)

1045. Favorite Color Stripe (30) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 ...

PAT 1045. Favorite Color Stripe (30)

1045. Favorite Color Stripe (30) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 ...

PAT A 1045. Favorite Color Stripe (30)

题目

【PAT】1045. Favorite Color Stripe (30)

Eva is trying to make her own color stripe out of a given one. She would like to keep only her favor...

1045. Favorite Color Stripe (30)

1045. Favorite Color Stripe (30)
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:1045. Favorite Color Stripe (30)
举报原因:
原因补充:

(最多只允许输入30个字)