hdu 5087 Revenge of LIS II

来源:互联网 发布:大数据时代的特点 编辑:程序博客网 时间:2024/06/06 01:48
求一个数组的不同子串中的“次大”LIS,但是1 4 3答案是2,因为"1 4"和"1 3"为最大的两个子串。




代码1:
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int a[1005],f[1005],p[1005];int main(){    int T,n;    scanf("%d",&T);    while(T--)    {        scanf("%d",&n);        for(int i=1;i<=n;i++)            scanf("%d",&a[i]);        a[0]=0;        f[0]=0;        for(int i=1;i<=n;i++)        {            int k=0;            for(int j=1;j<i;j++)                if(a[j]<a[i] && f[j]>=f[k]) k=j;            f[i]=f[k]+1;            p[i]=k;        }        int mmax=0,m;        for(int i=1;i<=n;i++)            if(f[i]>mmax) mmax=f[i];        int ok=0,cnt=0;        for(int i=1;i<=n;i++)        if(f[i]==mmax){        cnt++;        if(cnt>1) {ok=1;break;}        m=i;        while(m && !ok){            int x=a[m];            m=p[m];            for(int i=1;i<m;i++)                if(f[i]==f[m] && a[i]<x) {ok=1;break;}        }        if(ok) break;        }     //   printf("ok=%d\n",ok);        if(ok) printf("%d\n",mmax);        else printf("%d\n",mmax-1);    }    return 0;}/*33 1 2*/

代码2:

#include <iostream>#include<cstdio>#include<cstring>using namespace std;int a[1005],f[1005],c[1005];int main(){    int T,n,ok,mmax,sum;    scanf("%d",&T);    while(T--)    {        scanf("%d",&n);        for(int i=1;i<=n;i++)            scanf("%d",&a[i]);        for(int i=1;i<=n;i++)            {                f[i]=c[i]=1;  // 初始化都是一条路                for(int j=1;j<i;j++)                    {                        if(a[j]>=a[i]) continue; //a[i]>a[j]                        if(f[j]+1>f[i]){                            f[i]=f[j]+1;                            c[i]=c[j];                        }else if(f[j]+1==f[i]) c[i]=2;                    }            }        mmax=sum=0;        for(int i=1;i<=n;i++)            if(f[i]>mmax) mmax=f[i];        for(int i=1;i<=n;i++)            if(f[i]==mmax) sum+=c[i];        printf("%d\n",sum>1?mmax:mmax-1);    }    return 0;}


0 0
原创粉丝点击