P1108 低價購買 DP

2022-02-22 12:58:58 字數 675 閱讀 2565

給定乙個序列, 求最長下降子串行,及不重複的方案數。

洛谷鏈結

最長下降子串行可以用 o(n^2) 的簡單dp來求。  

不難發現: 在乙個元素互不相同的序列中,不會出現重複方案,因此可以通過dp累計答案(詳見**)。然後考慮去重,發現以x結尾的最長序列, 位置靠後的x的方案會包括位置靠前的x的方案。 因此可以刪除最後乙個x之前的x,dp後剩下的序列是互異的,因此答案不重複。

蒟醜

#include #include 

#include

#include

#define inf 0x3f3f3f3f

using

namespace

std;

struct

pf[5005

], lp;

int n, ans=0, ans1=0

;bool cmp(const p& a, const p& b)

intmain()

}sort(f+1, f+n+1

, cmp);

int end = 2;while(f[end].l == f[end-1].l) end++;

for(int i=1; if[i].a;

cout

<< ans << '

'

}

P1108 低價購買dp

第一問,求乙個最長的下降子串行就可以了。難點在於第二問,解決方法 設f i 表示到i這一位置,最長下降子串行的最大方案數 當構成序列相同時,可以看出 呃,舉個例子吧 為 4 2 2 3 1 最長的下降子串行為 4 2 1 或 4 2 1 或4 3 1 有兩種是相同的,可以判斷出數字2,用後面的就包括...

P1108 低價購買

原題鏈結 d i 是以 i 這個位置結束的最長下降子串行的長度 第一問就是求個最長下降子串行 第二問 記錄以 i 這個位置結束 長度為d i 的下降子串行的方案總數 d i d j 1 1 j i 的 j 的方案數相加 但是當兩個不同的位置上存的數相同且均滿足上式時 就會產生重複 因為位置靠後的數肯...

P1108 低價購買

對於第一問很容易看出是求最長下降子串行,n2 的暴力就可解決。而第二問是求最優方案數 且不重複 需要判重。可以在求解最長下降子串行的基礎上增開乙個陣列 g g i 表示以 i 結尾,不同的最優方案數。include include include include include include in...