#include<stdio.h>
#include<queue>
#include<algorithm>
#include<string.h>
#include<vector>
#define nn 1005
#define INF 0x3f3f3f
using namespace std;

int n,m,f[nn][nn],tem,pre[nn],vis[nn],maxx=0,d[nn][nn],maxnum=0,ans=1,k,i,num[nn];

/*void pro()
{
    for(i=0; i<=n+m+1; i++)
        for(j=0; j<=n+m+1; j++)
            if(f[i][j])
                printf(\"f[%d][%d]=%d\\n\",i,j,f[i][j]);
}*/


int bfs(int st,int en)
{
    tem=INF;
    memset(vis,0,sizeof(vis));
    memset(pre,-1,sizeof(pre));
    for(i=1; i<=n; i++)
        pre[i+n]=i;
    int flag=0;
    queue <int> q;
    q.push(st);
    vis[st]=1;

    while(!q.empty())
    {
        int u=q.front();
        q.pop();
        for(i=1; i<=2*n; i++)
        {

            if((!vis[i])&&(f[u][i]>0))
            {
                vis[i]=1;
                pre[i]=u;
                printf(\"pre[%d]=%d\\n\",i,u);

                    q.push(i);


            }//若
            else if(f[u][2*n+1]>0)
            {
                pre[2*n+1]=u;
                printf(\",wpwe pre[%d]=%d\\n\",2*n+1,u);
                flag=1;

            }

        }
    }


    return flag;
}

void EK(int en)
{
    printf(\"ok,ek!\\n\");


    maxnum=0;
    maxx=0;
    while(bfs(0,2*n+1))
    {
        ans=1;

        for(k=en; pre[k]!=-1; k=pre[k])
        {
            printf(\"k==%d\\n,pre[%d]=%d\\n\",k,k,pre[k]);
            f[pre[k]][k]-=1;
            f[k][pre[k]]+=1;
            printf(\"f[%d][%d]=%d,f[%d][%d]=%d\\n\",pre[k],k,f[pre[k]][k],k,pre[k],f[k][pre[k]]);
            if((k>=1)&&(k<=n)&&(pre[k]>=n+1)&&(pre[k]<=2*n)&&(f[k][pre[k]]==1))

            {
                ans++;
                printf(\"plus\\n\");
            }
        }

        printf(\"oui,maxx=%d,maxnum=%d\\n\",maxx,maxnum);
        if(maxx<ans)
        {
            maxx=ans;
            maxnum=0;

        }
        if(maxx==ans)
        {
            maxnum++;
        }
        printf(\"yes,maxx=%d,maxnum=%d\\n\",maxx,maxnum);

    }


    printf(\"final,maxx=%d,maxnum=%d\\n\",maxx,maxnum);
}

int main()
{

    scanf(\"%d\",&n);//n个点
    memset(f,0,sizeof(f));
    for(i=1; i<=n; i++)
    {
        scanf(\"%d\",&num[i]);


        f[i][i+n]=1;
        if(i>=2)
        {
            if(num[i]>num[i-1])
            {
                f[i+n-1][i]=1;
                printf(\"%d and %d\\n\",i+n-1,i);
            }
            else
            {
                f[0][i]=1;

                f[i+n-1][2*n+1]=1;

                for(k=i-1; k>0; k--)
                {
                    if(num[k]<num[i])
                    {
                        f[0][i]=0;//这是接上前面的
                        f[k+n][i]=1;
                        break;
                    }
                }
            }
        }
    }
    f[0][1]=1;
    f[2*n][2*n+1]=1;
    for(i=0; i<=2*n+1; i++)
        for(k=0; k<=2*n+1; k++)
        {
            if(f[i][k])
                printf(\"f[%d][%d]=%d\\n\",i,k,f[i][k]);
            d[i][k]=f[i][k];
        }
    EK(2*n+1);
    printf(\"sec!\\n\");
    for(i=0; i<=2*n+1; i++)
        for(k=0; k<=2*n+1; k++)
        {

            f[i][k]=d[i][k];
            if(f[i][k])
                printf(\"f[%d][%d]=%d\\n\",i,k,f[i][k]);
        }
         f[1][1+n]=f[0][1]=f[n][2*n]=f[2*n][2*n+1]=INF;

    for(i=0; i<=2*n+1; i++)
        for(k=0; k<=2*n+1; k++)
        {
            if(f[i][k])
                printf(\"f[%d][%d]=%d\\n\",i,k,f[i][k]);
        }
    printf(\"sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss\\n\");
    EK(2*n+1);
    return 0;
}//子序列,主要是建图要一些技巧,然后注意给最前一点和最后点INF就行

 

收藏 打印