HDU 3998 Sequence

14 篇文章 1 订阅

求最长上升子序列的长度以及个数,由于数据水,可以直接找  正解是DP+网络流

#include "cstring"
#include "iostream"
#include "algorithm"
#include "cstdio"
#include "queue"
#include "set"
using namespace std;
typedef long long LL;
const int M=100050;
const int INF = 0x3f3f3f3f;

int a[M],b[M];
int vis[M];
int ans,cnt;
int search(int num,int low,int high)
{
    int mid;
    while(low<=high)
    {
        mid=(low+high)/2;
        if(num>b[mid])
            low=mid+1;
        else
            high=mid-1;
    }
    return low;

}

int DP(int n)
{
    int i,len,pos;
    len=0;
    for(int i=1; i<=n; ++i)
    {
        if(vis[i])
        {
            continue;
        }
        pos=search(a[i],1,len);
        b[pos]=a[i];
        if(pos>len)
        {
            len++;
            vis[i]=1;
        }


        //vis[i]=1;
    }

    return len;

}

int main()
{
    int n;
    while(cin>>n)
    {
        for(int i=1; i<=n; ++i)
        {
            cin>>a[i];

        }
        ans=0,cnt=1;
        int m=n;
        // memset(b,0,sizeof(b));
        memset(vis,0,sizeof(vis));
        while(m--)
        {
            memset(b,0,sizeof(b));
            int temp=DP(n);
            if(temp>ans)
            {
                ans=temp;
                cnt=1;
            }
            else if(temp==ans)
            {
                cnt++;
            }
            else if(temp<ans)
                break;

        }

        cout<<ans<<"\n"<<cnt<<endl;

    }

    return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值