«Нелинейная DP · LIS программа число повторов» Купить низкий, купить ниже

Название Описание

Здесь Insert Picture Описание

решение проблемы

Очевидно, что мы можем вычислить самый примитивный нарастания длинной последовательности. Мы можем начать снова самый основной предварительно DP ответ.

Далее рассмотрим ряд уникальных программ:

Не трудно найти, для текущей позиции я появился перед и я я то же число не будет ответом. потому что я я включаю воригинальный ответ, и ответ на основе нового оригинального ответа, это вполне возможнок исходной точке покрытию. Таквыбирайте я я схема выше вариант будет пустым.

Для расчета программы, существуют две точки:

  • Если длина 1 1 , программа 1 1 .
  • В противном случае, s в м [ i ] = s u m [ j ] ( f [ i ] = f [ j ] + 1 ) сумма [I] = \ сумма сумма [J] (е [I] = F [J] +1)

Код хорошо понял:

#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;
} 

рекомендация

отblog.csdn.net/Ronaldo7_ZYB/article/details/92430072