2 条题解

  • 0
    @ 2025-10-8 16:56:44
    #include<bits/stdc++.h>
    using namespace std;
    const int N=5100;
    typedef long long LL;
    int a[N],f[N]; 
    double d[N];
    int main()
    {
        int n;scanf("%d", &n);
        for(int i=1; i<=n; i++) scanf("%d", &a[i]);a[++n]=-1;
        memset(f,0,sizeof(f));memset(d,0,sizeof(d));
        for(int i=1;i<=n;i++)
        {
            d[i]=f[i]=1;
            map<int,bool>mp;
            for(int j=i-1;j>=1;j--)if(a[j]>a[i])
            {
                if( f[j]+1>f[i] )
                {
                    f[i]=f[j]+1;
                    d[i]=d[j];
                    mp.clear();mp[a[j]]=1;
                }      
                else if( f[j]+1==f[i] && !mp[a[j]] )
                {
                    d[i]+=d[j];
                    mp[a[j]]=1;
                }
            }
        }
        printf("%d %.0lf\n", f[n]-1,d[n]);
        return 0;
    }
    
    • 0
      @ 2025-10-8 16:56:37
      #include<bits/stdc++.h>
      using namespace std;
      const int N=5100;
      typedef long long LL;
      int a[N],f[N]; 
      double d[N];
      int main()
      {
          int n;scanf("%d", &n);
          for(int i=1; i<=n; i++) scanf("%d", &a[i]);a[++n]=-1;
          memset(f,0,sizeof(f));memset(d,0,sizeof(d));
          for(int i=1;i<=n;i++)
          {
          	d[i]=f[i]=1;
          	map<int,bool>mp;
          	for(int j=i-1;j>=1;j--)if(a[j]>a[i])
          	{
          		if( f[j]+1>f[i] )
      			{
      				f[i]=f[j]+1;
      				d[i]=d[j];
      				mp.clear();mp[a[j]]=1;
      			}      
          		else if( f[j]+1==f[i] && !mp[a[j]] )
      			{
      				d[i]+=d[j];
      				mp[a[j]]=1;
      			}
          	}
          }
          printf("%d %.0lf\n", f[n]-1,d[n]);
          return 0;
      }
      • 1

      *【动态规划:区间一维一边推】最长下降子序列的长度及方案数[USACO4.3逢低吸纳]

      信息

      ID
      1400
      时间
      1000ms
      内存
      30MiB
      难度
      6
      标签
      递交数
      162
      已通过
      50
      上传者