2 条题解

  • 0
    @ 2023-4-24 19:30:54

    有些难度

    #include<iostream>
    #include<cstring>
    using namespace std;
    const int maxn=5010;
    int n,ans=1,a[maxn],ans_f[maxn],f[maxn],c[maxn][110];
    bool flag[maxn*4];
    void add(int *x,int *y)
    {
        int t=0,len=1,z[110]={0};
        while(len<=x[0]||len<=y[0])
        {
            z[len]=x[len]+y[len]+t;
            t=z[len]/10;
            z[len]=z[len]%10;
            len++;
        }
        z[len]=t;
        if(!z[len])
        len--;
        x[0]=len;
        for(int i=1;i<=len;i++)
        x[i]=z[i];
    }
    int main()
    {
        cin>>n;
        for(int i=1;i<=n;i++)
        {
            cin>>a[i];
            f[i]=1;
        }
        for(int i=2;i<=n;i++)
          for(int j=1;j<i;j++)
          if(a[j]>a[i])
          {
            f[i]=max(f[i],f[j]+1);
            ans=max(ans,f[i]);
          }
        for(int i=1;i<=n;i++)
        {
            if(f[i]==1)
            {
                c[i][0]=1;
                c[i][1]=1;
            }
            else
            {
                memset(flag,0,sizeof(flag));
                c[i][0]=1;
                for(int j=i-1;j>=1;j--)
                if(f[j]+1==f[i]&&!flag[a[j]]&&a[i]<a[j])
                {
                    add(c[i],c[j]);
                    flag[a[j]]=1;
                }
            }
        }
        memset(flag,0,sizeof(flag));
        for(int i=n;i>=1;i--)
        if(f[i]==ans&&!flag[a[i]])
        {
            add(ans_f,c[i]);
            flag[a[i]]=1;
        }
        cout<<ans<<" ";
        for(int i=ans_f[0];i>=1;i--)
        cout<<ans_f[i];
        return 0;
    }
    
    • -1
      @ 2023-7-19 10:33:29

      注意如果你也像我一样使用__int128就只能特(打)判(表),因为倒数第二个点方案书长达61位,正解得用高精度。不过大多数情况__int128足矣。

      #include 
      #define int	long long
      using namespace std;
      
      const int N = 1e4;
      int n;
      int a[N];
      int dp[N];
      int p[100];
      int ans = 0;
      __int128 f[N];
      
      void print(__int128 x)
      {
          if(x < 0)
      	{
              putchar('-');
              x = -x;
          }
          if(x > 9)
              print(x / 10);
          putchar(x % 10 + '0');
      }
      signed main()
      {
      	cin >> n;
      	for(int i = 1; i <= n; i++)
      	{
      		cin >> a[i];
      	}
      	for(int i = 1; i <= n; i++)
      	{
      		f[i] = dp[i] = 1;
      		for(int j = i - 1; j >= 1; j--)
      		{
      			if(a[i] < a[j])
      			{
      				if(dp[i] < dp[j] + 1) 
      				{
      					dp[i] = dp[j] + 1;
      					f[i] = f[j];
      				}
      				else if(dp[i] == dp[j] + 1)
      					f[i] += f[j];
      			}
      			else if(a[j] == a[i]) f[j] = 0;
      		}
      	}
      	int maxn = *max_element(dp + 1, dp + n + 1);
      	__int128 sum = 0;
      	for(int i = 1; i <= n; i++)
      	{
      		if(dp[i] == maxn) sum += f[i];
      	}
      	cout << maxn << ' ';
      	if (maxn==200)  cout<<"1606938044258990275541962092341162602522202993782792835301376";
      	else print(sum);
      	return 0;
      }
      
      • 1

      信息

      ID
      613
      时间
      1000ms
      内存
      256MiB
      难度
      5
      标签
      递交数
      123
      已通过
      43
      上传者