Code Forces 582 B. Once Again...(LIS)

4705 단어
Description은 한 길이의len의 서열과 한 정수 t를 제시하고 한 길이의len*t를 구성하는 서열은 a[i]=a[i-len](len#include<stdio.h> #include<string.h> #define maxn 100*100+1 #define INF 1<<29 int len,t,a[maxn],cnt[301]; int dp[maxn],n; int get_upper_bound(int x) { int l=0,r=n-1; while(l<=r) { int mid=(l+r)>>1; if(dp[mid]>x) r=mid-1; else l=mid+1; } return l; } int LIS(int a[]) { for(int i=1;i<n;i++) dp[i]=INF; dp[0]=a[0]; int len=1; for(int i=1;i<n;i++) { if(a[i]>=dp[len-1]) dp[len++]=a[i]; else dp[get_upper_bound(a[i])]=a[i]; } return len; } int main() { while(~scanf("%d%d",&len,&t)) { memset(cnt,0,sizeof(cnt)); for(int i=0;i<len;i++) { scanf("%d",&a[i]); cnt[a[i]]++;// } int max=0; for(int i=0;i<=300;i++)// max=max<cnt[i]?cnt[i]:max; n=len*(len>t?t:len); for(int i=len;i<n;i++) a[i]=a[i-len]; int ans=LIS(a);// min(t,len)*len LIS ans+=(t>len?t-len:0)*max;// LIS LIS printf("%d
"
,ans); } return 0; }

좋은 웹페이지 즐겨찾기