pat_1045

                  此题开始看题目的时候看的就不是很懂,后来题目是看懂了但是感觉有点复杂,题目的大概意思就是怎么在一个串中找到另一个串中的最大子串,其中子串中的数字可以重复,首先来想一下直观的方法,就是怎样找到这样的最大子串,那就把所有的情况都列出来,但是这是不现实的因为这样没有什么一般方法,用程序是编不出的,现在只有来想一般的方法了,其实编写程序都遵循这样的特点,就是从简单到复杂,从最基础的开始然后一步一步的变复杂。有了这种思想之后了,就好办了,那么给定的一个序列怎样找到另一个子序列呢?从这个序列的开头一步一步的来找,最后就会得到结果,这样的主要问题就是如何一步一步的这样找,第一步就是从要找的串中剔除给定的串中没有的元素,为什么了,因为没有的元素一定不会再最长子串中,所以这样找的结果和原没有剔除的结果是一样的,但是这样比原来会简单许多,要找到最大的子串的长度,就要设置一个最长的变量初值为零,和数组dp[],注意此时的dp[i]不是表示在前i个元素中最大的匹配的子串长度,而是,能加进元素i的最大长度,这样会使问题简单许多,最后得到的结果即为满足题目要求,现付代码如下:

#include<iostream>
#include<cstdio>
using namespace std;
int temp[10010];
int dp[10010];
int main()
{
	int total_num;
	int favour_num;
	int _prority[210];
	int L;
	int color;
	int i,j;
	scanf("%d",&total_num);
	for(i = 0;i <= total_num;i++)_prority[i] = 0;
	scanf("%d",&favour_num);
	for(i = 1;i <= favour_num;i++)
	{
		scanf("%d",&color);
		_prority[color] = i;
	}
	scanf("%d",&L);
	int len = 0;
	for(i = 1;i <= L;i++)
	{
		scanf("%d",&color);
		if(_prority[color] != 0)
			temp[len++] = _prority[color];
	}
	int max = 0;
	for(i = 0;i < len;i++)
	{
		dp[i] = 1;
		for(j = 0;j < i;j++)
		{
			if(temp[j] <= temp[i] && dp[i] < dp[j] + 1)dp[i] = dp[j] + 1;
		}
		if(dp[i] > max)max = dp[i];
	}
	printf("%d\n",max);
	return 0;
}

 题记:开始的时候做此题总是一个些测试点过不去,总结原因是因为把dp[i]定义为前i个元素中最大子串的长度,这样就使问题复杂化了,并且还不宜做出来。

当然说道动态规划浙大考研机试还出过一道最大子段和的问题,,现来简单的分析一下,题目大概意思是给定一串数字,要求从这串数字中找到连续且连续的和最大的那个数,如何去分析呢?这个确实有点不好下手,但是可以说和前面的思想是一致的,也是一步一步的来求解。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值