第一問,求乙個最長的下降子串行就可以了。
難點在於第二問,解決方法:
設f[i]表示到i這一位置,最長下降子串行的最大方案數;
當構成序列相同時,可以看出……呃,舉個例子吧:
****為:4 , 2 , 2 , 3 , 1
最長的下降子串行為:4 2 1 或 4 2 1 或4 3 1 ,有兩種是相同的,可以判斷出數字2,用後面的就包括前面的了。
那麼 , f[i]=σf[j],( 0< j< i 且d[j]=d[i]-1且a[j]不重複)
處理時,就可以在處理出f[i]後,把前面的f[j]==f[i]的f[j]改為0就可以了。
!!而且,當且僅當d[i]=1時,f[i]=1!!切記!
**
#include
#include
#include
#include
using
namespace
std;
int d[5009],f[5009];
int n,a[5009],m1,m2;
int main()
d[n+1]=1;f[1]=1;
for(int i=2;i<=n+1;i++)
d[i]+=maxn;
if(d[i]==1) f[i]=1;
for(int j=1;j<=i-1;j++)
P1108 低價購買 DP
給定乙個序列,求最長下降子串行,及不重複的方案數。洛谷鏈結 最長下降子串行可以用 o n 2 的簡單dp來求。不難發現 在乙個元素互不相同的序列中,不會出現重複方案,因此可以通過dp累計答案 詳見 然後考慮去重,發現以x結尾的最長序列,位置靠後的x的方案會包括位置靠前的x的方案。因此可以刪除最後乙個...
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...