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)

最长公共非连续子序列的变种 #include #include using namespace std; int favorite[205] = {0}; int stripe[1000...

1045. Favorite Color Stripe (30)

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

1045. Favorite Color Stripe (30)

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

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

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

动态规划之LCS和LIS

(一)最长公共子序列 (二)dai

微软hiho上的笔试题:Tower Defense Game

题目链接:http://hihocoder.com/contest/mstest2015sept1/problem/3 题目: 题目3 : Tower Defense Game 时间限制...

pat1045Favorite Color Stripe (30)

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

PAT 1045. Favorite Color Stripe (30)

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

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...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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