CF582B Solution

题目链接

题解

因为\(T\)段内容均为相同的,最多只需\(n\)个重复区间即可包含最长不降子序列中的全部元素。因此将复制\(n\)\(a\)数组进行LIS计算即可得出包含答案序列全部元素的上升子序列,朴素dp时间复杂度为\(O(n^4)\),可以通过。而对于剩下的重复区间,利用贪心思想取\(a\)数组中出现次数最多的元素,插入前述区间中即可。\(ans=n\)段LIS长度\(+\)剩余区间数量\(\times a\)中元素最多出现次数。

AC代码

#include<bits/stdc++.h>
using namespace std;
const int N=110;
int a[N*N],dp[N*N],cnt[310];//cnt[i]:值为i的元素在a数组中的数量
int main()
{
	int n,t,ans=0,maxc=0;//maxc:cnt中元素最大值
	scanf("%d%d",&n,&t);
	for(int i=1;i<=n;i++) {scanf("%d",&a[i]); cnt[a[i]]++;}
	a[0]=a[n];
	int m=min(t,n);//存在重复次数<n的情况
	for(int i=n+1;i<=m*n;i++) a[i]=a[i%n];//复制m次
	for(int i=1;i<=m*n;i++)//LIS
	{
		dp[i]=1;
		for(int j=0;j<i;j++)
			if(a[j]<=a[i]) dp[i]=max(dp[i],dp[j]+1);
		ans=max(ans,dp[i]);
	}
	for(int i=1;i<=n;i++) maxc=max(maxc,cnt[a[i]]);
	printf("%d",ans+(t-m)*maxc);
	return 0;
}
posted @ 2021-02-07 17:27  violet_holmes  阅读(56)  评论(0编辑  收藏  举报