題目鏈結
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 #include4using
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 的方案數相加 但是當兩個不同的位置上存的數相同且均滿足上式時 就會產生重複 因為位置靠後的數肯...