前言
我也太菜了吧,这都没想到
传送门 : https://www.luogu.com.cn/problem/P1108
思路
O n^3的做法 一定是不行的
所以我们需要考虑 O n^2的做法 或者是 更低
因为我们需要统计答案的种类数 所以不难想象我们还需要在 转移的时候 再加一个dp
这样子我们才能记录
因此我们需要在每次需要做转移的时候 都要记录一个 t[ i ] 表示 当前是由 几个数转移过来的
因此 思路就清晰起来了
CODE
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 5e5+10;
using ll = long long;
int f[N],a[N];
int t[N];
void solve()
{
int n;
cin>>n;
for(int i=1; i<=n; i++)
{
cin>>a[i];
f[i] =1 ;
}
int maxx = 0 ;
for(int i=1;i<=n;i++)
{
for(int j=1;j<i;j++)
if(a[i]<a[j])
f[i] = max(f[i],f[j]+1);
for(int j=1;j<i;j++)
if(f[i] == f[j] && a[i] == a[j])
t[j] = 0;
else///由aj转移过来
if(f[i] == f[j]+1 && a[i]<a[j])
t[i]+=t[j];
if(!t[i])///如果当前数是目前为止最大的
t[i] = 1;
}
int num = 0;
int ans =0,res = 0 ;
for(int i=1; i<=n; i++)
ans = max(ans,f[i]);
for(int i=1;i<=n;i++)
if(f[i]==ans)
res+=t[i];
cout<<ans<<" "<<res<<endl;
// cout<<ans<<endl;
}
signed main()
{
ios::sync_with_stdio(false);
solve();
return 0;
}