洛谷 P1108 低價購買(LIS,統計方案數)

2022-02-13 13:42:44 字數 971 閱讀 2685

看第乙個要求,很顯然是求最長下降子串行,和lis幾乎一樣,很簡單,再看第二個問號,求最長下降子串行的方案數??這怎麼求?

注意:當二種方案「看起來一樣」時(就是說它們構成的**佇列一樣的時候),這2種方案被認為是相同的。

這裡就用到了一種基於dp的dp。

我們用a[i]存原來的數,f[i]存以第i個數結尾的最長下降子串行的長度,t[i]存以i結尾的最長下降子串行的方案數。

f[i]照常求,那麼t[i]不能重複,怎麼求呢?

首先,對於每乙個i,列舉j=1...i-1。

最後,如果t[i]還是等於0,那麼代表著a[i]不能成為任何乙個序列的最後乙個數,說明a[i]是到目前為止的最大的數,這時t[i]賦值為1。

最後統計出答案即可。

1 #include2 #include3

using

namespace

std;

4const

int maxn=5005;5

inta[maxn],f[maxn],t[maxn];6//

a[i]存原來的數,f[i]存以第i個數結尾的最長下降子串行的長度,7//

t[i]存以i結尾的最長下降子串行的方案數

8int

n,maxf;

9long

long

ans;

10int

main()

1118

if(f[i]==0) f[i]=1

;19 maxf=max(maxf,f[i]);

20for(int j=1;j)

24if(f[i]==f[j]+1&&a[i]28if(t[i]==0) t[i]=1;29

}30for(int i=1;i<=n;i++)

33 cout<"

"<34return0;

35 }

洛谷 P1108 低價購買

題目 低價購買 思路 第一問求最長下降子串行,o n 2 的複雜度就夠了。第二問如果不考慮重複的情況,也好做。令g i 表示最長下降子串行長為f i 時的方案數,g i g j j 1,i 最終方案數為 g i i 1,n 然後再減去重複的情況。假設存在一組i,j使得f i f j 且a i a j...

洛谷P1108 低價購買

題目鏈結 n 5000 n 2的演算法是可以接受的 第乙個數字顯然是求最長下降子串行,可以n 2或nlogndp 要求方案數,可以在n 2演算法中做一些修改,dp求方案數 dp i 表示以第i個數為結尾的最長下降子串行 f i 表示以第i個數為結尾的最長下降子串行的個數 當a j 而當a i a j...

洛谷P1108 低價購買

1 include2 using namespace std 3const int maxn 5005 4 int n,len ans 1 ans 5int a maxn d maxn len maxn f maxn 6int search int l,int r,int val 714 retur...