程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> hdu 3998(最大上升子序列加序列數目)

hdu 3998(最大上升子序列加序列數目)

編輯:C++入門知識

我看別人都是用網絡流做的,我不會網絡流。

我的方法是正常的求出最大上升子序列,然後對這個序列中所有的值全部做一下標記,標記這個數據已經使用過。然後對剩下的數據繼續進行求最大上升子序列的操作。直到求出的序列長度達不到最大長度。

這樣能AC是建立在hdu的測試數據比較弱和數據量比較小的情況下,在最惡劣的狀況下,這樣算的時間復雜度是O(n^3)。

還是不習慣用codeblocks debug。


[cpp]
#include<stdio.h>  
#include<string.h>  
#define N 500  
struct node 

    int x,pre; 
    int count; 
} a[N]; 
int mark[N]; 
int main() 

    int n; 
    int i,j,ans; 
    int count; 
    while(scanf("%d",&n)!=EOF) 
    { 
        for(i=0; i<n; i++) 
        { 
            scanf("%d",&a[i].x); 
            a[i].pre=i; 
            a[i].count=1; 
            mark[i]=0; 
        } 
        for(i=0; i<n; i++) 
        { 
            for(j=0; j<i; j++) 
            { 
                if(a[j].x<a[i].x&&a[j].count>=a[i].count) 
                { 
                    a[i].count=a[j].count+1; 
                    a[i].pre=j; 
                } 
            } 
        } 
        ans=0; 
        int temp; 
        for(i=0; i<n; i++) 
        { 
            if(ans<a[i].count) 
            { 
                ans=a[i].count; 
                temp=i; 
            } 
        } 
        int x; 
        x=temp; 
        while(1) 
        { 
            mark[x]=1; 
            if(a[x].pre==x) 
                break; 
            x=a[x].pre; 
        } 
        count=1; 
 
 
 
 
        int ss; 
        ss=ans; 
        while(ans==ss) 
        { 
            for(i=0; i<n; i++) 
            { 
                a[i].count=1; 
                a[i].pre=i; 
            } 
            for(i=0; i<n; i++) 
            { 
                if(mark[i]==1) 
                    continue; 
                for(j=0; j<i; j++) 
                { 
                    if(mark[j]==1) 
                        continue; 
                    if(a[j].x<a[i].x&&a[j].count>=a[i].count) 
                    { 
                        a[i].count=a[j].count+1; 
                        a[i].pre=j; 
                    } 
                } 
            } 
            ans=0; 
            int temp; 
            for(i=0; i<n; i++) 
            { 
                if(mark[i]==1) 
                    continue; 
                if(ans<a[i].count) 
                { 
                    ans=a[i].count; 
                    temp=i; 
                } 
            } 
            if(ans==ss) 
                count++; 
            int x; 
            x=temp; 
            while(1) 
            { 
                mark[x]=1; 
                if(a[x].pre==x) 
                    break; 
                x=a[x].pre; 
            } 
        } 
        printf("%d\n",ss); 
        printf("%d\n",count); 
    } 
    return 0; 

#include<stdio.h>
#include<string.h>
#define N 500
struct node
{
    int x,pre;
    int count;
} a[N];
int mark[N];
int main()
{
    int n;
    int i,j,ans;
    int count;
    while(scanf("%d",&n)!=EOF)
    {
        for(i=0; i<n; i++)
        {
            scanf("%d",&a[i].x);
            a[i].pre=i;
            a[i].count=1;
            mark[i]=0;
        }
        for(i=0; i<n; i++)
        {
            for(j=0; j<i; j++)
            {
                if(a[j].x<a[i].x&&a[j].count>=a[i].count)
                {
                    a[i].count=a[j].count+1;
                    a[i].pre=j;
                }
            }
        }
        ans=0;
        int temp;
        for(i=0; i<n; i++)
        {
            if(ans<a[i].count)
            {
                ans=a[i].count;
                temp=i;
            }
        }
        int x;
        x=temp;
        while(1)
        {
            mark[x]=1;
            if(a[x].pre==x)
                break;
            x=a[x].pre;
        }
        count=1;

 


        int ss;
        ss=ans;
        while(ans==ss)
        {
            for(i=0; i<n; i++)
            {
                a[i].count=1;
                a[i].pre=i;
            }
            for(i=0; i<n; i++)
            {
                if(mark[i]==1)
                    continue;
                for(j=0; j<i; j++)
                {
                    if(mark[j]==1)
                        continue;
                    if(a[j].x<a[i].x&&a[j].count>=a[i].count)
                    {
                        a[i].count=a[j].count+1;
                        a[i].pre=j;
                    }
                }
            }
            ans=0;
            int temp;
            for(i=0; i<n; i++)
            {
                if(mark[i]==1)
                    continue;
                if(ans<a[i].count)
                {
                    ans=a[i].count;
                    temp=i;
                }
            }
            if(ans==ss)
                count++;
            int x;
            x=temp;
            while(1)
            {
                mark[x]=1;
                if(a[x].pre==x)
                    break;
                x=a[x].pre;
            }
        }
        printf("%d\n",ss);
        printf("%d\n",count);
    }
    return 0;
}


 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved