codeforces Round 323D Once again(周期数列的最长非递减子序列)
- 题目链接
- 题目大意:给一个n和t,求t个这样重复的数列
a1,a2......an
的最长非递减子序列
- 解题思路:我看了很多博客,还是觉得这个解题思路对我来说有点难以理解,在n个循环里我们一定可以找到一个非递增子序列,而n之后的循环我们只需要往里插入重复次数最多的那个数就可以了。
- AC代码
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int a[101];
int dp[10010];
int b[301];
int main()
{
int n,t,i,num=0,cnt=0,j;
memset(b,0,sizeof(b));
scanf("%d%d",&n,&t);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
b[a[i]]++;
num=max(num,b[a[i]]);
}
// printf("%d\n",num);
for(i=0;i<10010;i++)
dp[i]=10000001;
if(t<=n)
{
for(i=0;i<t;i++)
{
for(j=0;j<n;j++)
{
*upper_bound(dp,dp+10010,a[j])=a[j];
}
}
printf("%d\n",lower_bound(dp,dp+10010,10000001)-dp);
}
else
{
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
*upper_bound(dp,dp+10010,a[j])=a[j];
}
}
long long ans=lower_bound(dp,dp+10010,10000001)-dp+num*(t-n);
printf("%lld\n",ans);
}
return 0;
}