pat_1045

来源:互联网 发布:免费vpn翻墙软件 编辑:程序博客网 时间:2024/04/29 21:00

                  此题开始看题目的时候看的就不是很懂,后来题目是看懂了但是感觉有点复杂,题目的大概意思就是怎么在一个串中找到另一个串中的最大子串,其中子串中的数字可以重复,首先来想一下直观的方法,就是怎样找到这样的最大子串,那就把所有的情况都列出来,但是这是不现实的因为这样没有什么一般方法,用程序是编不出的,现在只有来想一般的方法了,其实编写程序都遵循这样的特点,就是从简单到复杂,从最基础的开始然后一步一步的变复杂。有了这种思想之后了,就好办了,那么给定的一个序列怎样找到另一个子序列呢?从这个序列的开头一步一步的来找,最后就会得到结果,这样的主要问题就是如何一步一步的这样找,第一步就是从要找的串中剔除给定的串中没有的元素,为什么了,因为没有的元素一定不会再最长子串中,所以这样找的结果和原没有剔除的结果是一样的,但是这样比原来会简单许多,要找到最大的子串的长度,就要设置一个最长的变量初值为零,和数组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个元素中最大子串的长度,这样就使问题复杂化了,并且还不宜做出来。

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



原创粉丝点击