[P1108]低价购买

xiaoxiao2021-02-28  106

原题链接

d[i]是以 i 这个位置结束的最长下降子序列的长度

第一问就是求个最长下降子序列

第二问 记录以 i 这个位置结束 长度为d[i]的下降子序列的方案总数 d[i]=d[j]+1(1<=j < i)的 j 的方案数相加 但是当两个不同的位置上存的数相同且均满足上式时 就会产生重复 因为位置靠后的数肯定包含了位置靠前的数所有的方案 所以只保留位置靠后的方案数

#include<iostream> #include<cstring> #include<algorithm> #include<cstdio> #include<cmath> #include<queue> #include<vector> #include<climits> #include<string> #include<cstdlib> #include<ctime> #define MOD 10007 #define LL long long using namespace std; int n,i,j,cost[5005],down[5005],solu[5005],ans1,ans2; int main() { scanf("%d",&n); for(i=1;i<=n;i++) { scanf("%d",&cost[i]); down[i]=1; } for(i=1;i<=n+1;i++) { for(j=1;j<i;j++) if(cost[i]<cost[j]) down[i]=max(down[i],down[j]+1); if(down[i]==1) solu[i]=1; for(j=1;j<i;j++) { if(cost[i]==cost[j]) solu[j]=0; if(cost[i]<cost[j]) if(down[i]==down[j]+1) solu[i]+=solu[j]; } } ans1=down[n+1]-1; ans2=solu[n+1]; printf("%d %d",ans1,ans2); return 0; }
转载请注明原文地址: https://www.6miu.com/read-52940.html

最新回复(0)