題目:低價購買
思路:第一問求最長下降子串行,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],那麼可以看出,g[j]一定包含g[i],所以可以直接讓g[i]=0去除重複。
**:
#includeusing namespace std;
#define maxn 5000
int n;
int a[maxn+5]=;
int f[maxn+5]=,g[maxn+5]=;
void readin()
}void dp()
for(int j=1;jif(!g[i]) g[i]=1; }}
void print()
printf("%d",s);
int cnt=0;
for(int i=1;i<=n;i++)
printf(" %d",cnt);
}int main()
洛谷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...
P1108 低價購買
原題鏈結 d i 是以 i 這個位置結束的最長下降子串行的長度 第一問就是求個最長下降子串行 第二問 記錄以 i 這個位置結束 長度為d i 的下降子串行的方案總數 d i d j 1 1 j i 的 j 的方案數相加 但是當兩個不同的位置上存的數相同且均滿足上式時 就會產生重複 因為位置靠後的數肯...