タイトル説明
問題の解決策
もちろん、私たちは最も原始的な上昇最長のシーケンスを計算することができます。私たちは再び、最も基本的な事前DPの答えを開始することができます。
次に、ユニークなプログラムの数を考慮してください。
見つけるのは難しいことではありません、現在位置Iのために、目の前に登場し、 同じ番号の回答ではありません。なぜなら 、元の答えを含めて、新しいオリジナルの答えに基づいて答えは、それが元のポイントカバレッジに完全に可能です。だから、選択 スキーム上記実施形態では空になります。
プログラムの計算のために、2つの点があります。
- の長さがあれば 、プログラムがあります 。
- それ以外の場合は、
コードはよく実現されています。
#include <bits/stdc++.h>
using namespace std;
int n,ans,sum;
int s[100000];
int a[100000];
int f[100000];
int main(void)
{
freopen("Buylow.in","r",stdin);
freopen("Buylow.out","w",stdout);
cin>>n;
ans = sum = 0;
for (int i=1;i<=n;++i) cin>>a[i];
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]);
f[i] ++;
ans = max(ans,f[i]);
}
for (int i=1;i<=n;++i)
{
for (int j=1;j<i;++j)
if (a[i] == a[j]) s[j] = 0;
if (f[i] == 1) s[i] = 1;
else for (int j=1;j<i;++j)
if (f[j]+1 == f[i] && a[i] < a[j]) s[i] += s[j];
}
for (int i=1;i<=n;++i)
if (f[i] == ans) sum += s[i];
cout<<ans<<' '<<sum<<endl;
return 0;
}