首页 > 代码库 > hdu 1025 dp 最长上升子序列
hdu 1025 dp 最长上升子序列
1 //Accepted 4372 KB 140 ms 2 //dp 最长上升子序列 nlogn 3 #include <cstdio> 4 #include <cstring> 5 #include <iostream> 6 using namespace std; 7 const int imax_n = 500005; 8 int dp[imax_n]; 9 int d[imax_n];10 int a[imax_n];11 int n;12 int len;13 int max(int a,int b)14 {15 return a>b?a:b;16 }17 int binary_search(int k)18 {19 int l=0;20 int r=len;21 while (l<=r)22 {23 int mid=(l+r)/2;24 if (d[mid]==k) return mid;25 if (d[mid]>k) r=mid-1;26 if (d[mid]<k) l=mid+1;27 }28 return l;29 }30 void Dp()31 {32 memset(dp,0,sizeof(dp));33 memset(d,0,sizeof(d));34 len=-1;35 for (int i=0;i<n;i++)36 {37 int j=binary_search(a[i]);38 //printf("j=%d\n",j);39 if (j>len) len++;40 dp[i]=j+1;41 d[j]=a[i];42 }43 int ans=0;44 for (int i=0;i<n;i++)45 ans=max(ans,dp[i]);46 if (ans==1)47 {48 printf("My king, at most 1 road can be built.\n");49 }50 else51 {52 printf("My king, at most %d roads can be built.\n",ans);53 }54 }55 int main()56 {57 int t=0;58 while (scanf("%d",&n)!=EOF)59 {60 int x,y;61 for (int i=0;i<n;i++)62 {63 scanf("%d%d",&x,&y);64 a[x-1]=y;65 }66 printf("Case %d:\n",++t);67 Dp();68 printf("\n");69 }70 return 0;71 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。