zoukankan      html  css  js  c++  java
  • PAT甲级1045. Favorite Color Stripe

    PAT甲级1045. Favorite Color Stripe

    题意:

    伊娃正在试图让自己的颜色条纹从一个给定的。她希望通过剪掉那些不必要的部分,将其余的部分缝合在一起,形成她最喜欢的颜色条纹,以保持最喜爱的顺序。

    据说正常的人眼可以区分大约少于200种不同的颜色,
    所以伊娃最喜欢的颜色是有限的。然而,原始条纹可能很长,而Eva希望拥有最大长度的剩余最喜欢的条纹。所以她需要你的帮助找到她最好的结果。

    请注意,解决方案可能不是唯一的,但您只需要告诉她最大长度。例如,
    给出一条条纹{2 2 4 1 5 5 6 3 1 1 5 6}。如果Eva最喜欢的颜色是以她最喜欢的顺序作为{2 3 1 5 6}给出,那么她有4个可能的最佳解决方案{2 2 1 1 1 5 6},{2 2 1 5 5 5 6},{2 2 1 5 5 6 6}和{2 2 3 1 1 5 6}。

    输入规格:

    每个输入文件包含一个测试用例。对于每种情况,
    第一行包含正整数N(<= 200),它是涉及的颜色总数(因此颜色从1到N编号)。然后下一行以正整数M(<= 200)开始,其次是以她最喜欢的顺序给出的M Eva最喜欢的颜色数字。
    最后,第三行以一个正整数L(<= 10000)开始,它是给定条带的长度,后面是条纹上的L个颜色。一行中的所有数字都以空格分隔。

    输出规格:

    对于每个测试用例,只需在一行中打印Eva最喜欢的条纹的最大长度。

    思路:

    就是让eva裁剪一块布,eva能裁剪出多长的一块布,并且布的颜色的order要按eva喜欢的颜色来。相当于最长非降序字串的问题。用dp做。时间复杂度O(n*m),n为布的长度,m为order的长度。

    ac代码:

    C++

    // pat1045.cpp : 定义控制台应用程序的入口点。
    //
    
    #include "stdafx.h"
    
    #include<iostream>
    #include<cstdio>
    #include<string>
    #include<algorithm>
    #include<queue>
    #include<vector>
    #include<cstring>
    #include<stdio.h>
    #include<map>
    #include<cmath>
    #include<unordered_map>
    
    using namespace std;
    //最长的非降子序列
    
    vector<int> origanal;
    
    int main()
    {
    	int n, m, l, temp;                              //n. color nums: 1 - n;   m. order nums;  l. origanal length;
    
    	//input
    	cin >> n;
    	cin >> m;
    	vector<int> order(n + 1,0);                          //类hash表储存order
    	for (int i = 1; i <= m; i++)                     //order数据
    	{
    		scanf("%d", &temp);
    		order[temp] = i;
    	}
    	cin >> l;
    	for (int i = 0; i < l; i++)                     //origanal数据
    	{
    		scanf("%d", &temp);
    		temp = order[temp];                         //把所有数字替换成order,按1...m排列
    		origanal.push_back(temp);
    	}
    
    	//handle problem
    	//dp思路:用count储存 count[i] 表示从开始时到现在,以第i个数为结尾,最长是多少。
    
    	int maxlen = 0;
    	vector<int> count(m + 1, 0);
    	for (int i = 0; i < l; i++)
    	{
    		if (origanal[i] == 0) continue;       //不在order,cut
    
    		count[origanal[i]]++;
    		for (int k = origanal[i] + 1; k <= m; k++)
    		{
    			if(count[k] < count[origanal[i]])
    				count[k]++;
    		}
    
    	}
    
    	//output
    	cout << count[m] << endl;
    
        return 0;
    }
    
    
    
  • 相关阅读:
    P1983 车站分级
    鬼知道NOI会不会成为下一个奥数
    设计模式之简单工厂模式(含样例源码下载)
    面向对象的七大设计原则(点滴的感悟与总结)
    网易笔试题 最长公共子括号序列
    网易笔试题 重排数列
    网易笔试题 游历魔法王国
    腾讯笔试题 字符移位(字符串操作)
    华为笔试题 最高分是多少(线段树)
    华为笔试题 扑克牌大小(模拟,细节处理)
  • 原文地址:https://www.cnblogs.com/weedboy/p/7278153.html
Copyright © 2011-2022 走看看