• POJ 2533 Longest Ordered Subsequence (LIS DP)


    最长公共自序列LIS

    三种模板,但是邝斌写的好像这题过不了

    N*N

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 using namespace std;
     5 const int N = 41000;
     6 int a[1010],dp[1010],n;
     7 int Lis(){
     8    dp[1]=1;
     9    int ans=1;
    10    int temp=0;
    11    for(int i=2;i<=n;i++){
    12       temp=0;
    13       for(int j=1;j<i;j++){
    14         if(dp[j]>temp&&a[i]>a[j]){
    15             temp=dp[j];
    16         }
    17       }
    18       dp[i]=temp+1;
    19       if(dp[i]>ans){
    20         ans=dp[i];
    21       }
    22    }
    23    return ans;
    24 }
    25 int main(){
    26     while(~scanf("%d",&n)){
    27         for(int i=1;i<=n;i++){
    28             scanf("%d",&a[i]);
    29         }
    30         printf("%d
    ",Lis());
    31     }
    32      return 0;
    33 }
    View Code

    N*logn

     1 #include <stdio.h>
     2 #include <algorithm>
     3 #include <string.h>
     4 using namespace std;
     5 
     6 int a[1005],dp[1005],c[1005],n;
     7 
     8 int bin(int sizee,int k)
     9 {
    10     int l = 1,r = sizee;
    11     while(l<=r)
    12     {
    13         int mid = (l+r)/2;
    14         if(k>c[mid] && k<=c[mid+1])
    15             return mid+1;
    16         else if(k<c[mid])
    17             r = mid-1;
    18         else
    19             l = mid+1;
    20     }
    21 }
    22 
    23 int LIS()
    24 {
    25     int i,j,ans=1;
    26     c[1] = a[1];
    27     dp[1] = 1;
    28     for(i = 2; i<=n; i++)
    29     {
    30         if(a[i]<=c[1])
    31             j = 1;
    32         else if(a[i]>c[ans])
    33             j = ++ans;
    34         else
    35             j = bin(ans,a[i]);
    36         c[j] = a[i];
    37         dp[i] = j;
    38     }
    39     return ans;
    40 }
    41 
    42 int main()
    43 {
    44     int i;
    45     while(~scanf("%d",&n))
    46     {
    47         for(i = 1; i<=n; i++)
    48             scanf("%d",&a[i]);
    49         printf("%d
    ",LIS());
    50 
    51     }
    52     return 0;
    53 }
    View Code

    没有AC

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 #include<iostream>
     5 #define clc(a,b) memset(a,b,sizeof(a))
     6 #define LL long long
     7 #include<cmath>
     8 const int inf=0x3f3f3f3f;
     9 using namespace std;
    10 const int MAXN=500010;
    11 int a[MAXN],b[MAXN];
    12 int Serch(int num,int low,int high) {
    13     int mid;
    14     while(low<=high) {
    15         mid=(low+high)/2;
    16         if(num>=b[mid])
    17             low=mid+1;
    18         else high=mid-1;
    19     }
    20     return low;
    21 }
    22 int Dp(int n) {
    23     int i,len,pos;
    24     b[1]=a[1];
    25     len=1;
    26     for(i=2; i<=n; i++) {
    27         if(a[i]>=b[len]) {
    28             len=len+1;
    29             b[len]=a[i];
    30         } else {
    31             pos=Serch(a[i],1,len);
    32             b[pos]=a[i];
    33         }
    34     }
    35     return len;
    36 }
    37 
    38 int main() {
    39     int n;
    40     while(~scanf("%d",&n)) {
    41         for(int i=1; i<=n; i++)
    42             scanf("%d",&a[i]);
    43         printf("%d
    ",Dp(n));
    44     }
    45 }
    View Code
  • 相关阅读:
    HDU 5842 Lweb and String 【乱搞】
    POJ 2342 Anniversary party 【树形DP】
    [ZJOI2008]树的统计Count 【树链剖分】
    UVA 136 & POJ1338 Ugly Numbers
    ccf 201803-2
    ccf 201809-5
    ccf 201809-4
    ccf 201809-2
    ccf 201809-1
    最小费用可行流
  • 原文地址:https://www.cnblogs.com/ITUPC/p/5289728.html
Copyright © 2020-2023  润新知