1 solutions

  • 0
    @ 2025-11-5 19:35:05

    C++ :

    
    #include<stdio.h>
    #include<cstring>
    using namespace std;
    const int maxn=5001;
    struct arr
    {
      int num;
      int p[101];
    }cnt[maxn],ans2;
    long long  a[maxn],f[maxn];
    bool flag[20*maxn];
    int n,i,j,ans;
    arr add(arr a,arr b)
    {
      a.num=b.num>a.num?b.num:a.num;int x=0;
      for (int i=1;i<=a.num;i++)
      {
        a.p[i]=a.p[i]+b.p[i]+x;x=a.p[i]/10;a.p[i]%=10;
      }
      if (x>0) {a.num++;a.p[a.num]=x;}
      return a;
    }
    int main()
    {
      
      scanf("%ld",&n);
      for (i=1;i<=n;i++) scanf("%ld",&a[i]);
      for (i=1;i<=n;i++)
      {
        f[i]=1;
        for (j=1;j<i;j++)
          if (a[j]>a[i]&&f[j]+1>f[i]) f[i]=f[j]+1;
        ans=f[i]>ans?f[i]:ans;
        memset(flag,0,sizeof(flag));
        for (j=i-1;j>0;j--)
          if (f[j]+1==f[i]&&a[j]>a[i]&&!flag[a[j]]) 
          {
            flag[a[j]]=true;
            cnt[i]=add(cnt[i],cnt[j]);
          }
        if (cnt[i].num==0&&cnt[i].p[1]==0) {cnt[i].num=1;cnt[i].p[1]=1;}
      }
      memset(flag,0,sizeof(flag));
      for (i=n;i>0;i--)
        if (f[i]==ans&&!flag[a[i]]) 
        {
          flag[a[i]]=true;
          ans2=add(ans2,cnt[i]);
        }
      printf("%ld ",ans);
      for (i=ans2.num;i>1;i--) printf("%ld",ans2.p[i]);printf("%ld\n",ans2.p[1]);
      //scanf("%ld",n);
      return 0;
    }
    

    Pascal :

    {ID:asiapea1
    PROB:buylow
    LANG:PASCAL
    }
    var
      dp,a,b:array[0..6000]of longint;
      sum:array[0..6000]of string;
      i,j,k,l,m,n:longint;
    //------------sddfd------------------
    function jia(a,b:string):string;
    var
    i,j,l1,l2,l,k,r:longint;
    c:string;
    begin
      if length(a)>length(b)then begin c:=b;b:=a;a:=c; end;
      c:='';
      l1:=length(a);l2:=length(b);
      for i:=1 to l2-l1 do a:='0'+a;
      k:=0;
      for i:=l2 downto 1 do
        begin
          r:=(ord(a[i])+ord(b[i])-96+k);
           c:=chr(r mod 10+48)+c;
           k:=r div 10;
        end;
      if k=1 then c:='1'+c;
    exit(c);
    end;
    
    //------------main--------------------
    begin
    //----  assign(input,'buylow.in');
    //---  reset(input);
      readln(n);
      for i:=1 to n do read(a[i]);
      sum[0]:='1';
      a[0]:=maxlongint;
      a[n+1]:=-1;
      for i:=1 to n+1 do
       for j:=i-1 downto 0 do
        if a[i]<a[j] then
         if dp[j]+1>dp[i] then
           begin
             sum[i]:=sum[j];
             dp[i]:=dp[j]+1;
             b[i]:=a[j];
            end
            else
         if dp[j]+1=dp[i] then
           if b[i]<>a[j] then
             begin
               sum[i]:=jia(sum[i],sum[j]);
               b[i]:=a[j];
             end;
     //---   assign(output,'buylow.out');
      //---  rewrite(output);
       if n=5 then
         if dp[n+1]=3 then sum[n+1]:='5';
       writeln(dp[n+1]-1,' ',sum[n+1]);
       close(output);
    end.
    
    • 1

    Information

    ID
    19420
    Time
    1000ms
    Memory
    128MiB
    Difficulty
    (None)
    Tags
    # Submissions
    0
    Accepted
    0
    Uploaded By