看第乙個要求,很顯然是求最長下降子串行,和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 #include3using
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...