洛谷P1108 低價購買

2022-05-05 21:18:12 字數 731 閱讀 2764

題目鏈結

n<=5000 n^2的演算法是可以接受的

第乙個數字顯然是求最長下降子串行,可以n^2或nlogndp

要求方案數,可以在n^2演算法中做一些修改,dp求方案數

dp[i]表示以第i個數為結尾的最長下降子串行

f[i]表示以第i個數為結尾的最長下降子串行的個數

當a[j]

而當a[i]==a[j]且dp[i]==dp[j]時,構成的子串行視為相同的,所以將乙個置為0,防止重複計算

1 #include2 #include3 #include4

using

namespace

std;

5#define n 5010

6int

n,a[n],dp[n],f[n],ans1,ans2;

7 inline int

read()

11return

x;12}13

intmain()

1430

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

31 ans1=max(ans1,dp[i]);

32for(int i=1;i<=n;i++)

33if(dp[i]==ans1) ans2+=f[i];

34 printf("

%d %d\n

",ans1,ans2);

35return0;

36 }

洛谷 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 低價購買

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...

P1108 低價購買

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