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;
}