P1108 低价购买——最长下降子序列+方案数
P1108 低价购买
最长下降子序列不用多讲;关键是方案数;
在求出f[i]时,我们可以比较前面的f[j];
如果f[i]==f[j]&&a[i]==a[j] 要将t[j]=0,去重;
这样将所有t[j]加起来就是方案数;
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn=5010; int n; int f[maxn],t[maxn]; int a[maxn]; int ma; int ans1,ans2; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); } for(int i=1;i<=n;i++) { for(int j=1;j<i;j++) { if(a[j]>a[i]) { f[i]=max(f[i],f[j]+1); } } if(!f[i]) f[i]=1; if(f[i]>ma) ma=f[i]; for(int j=1;j<i;j++) { if(f[i]==f[j]&&a[i]==a[j]) { t[j]=0; } else if(f[i]==f[j]+1&&a[i]<a[j]) { t[i]+=t[j]; } } if(!t[i]) t[i]=1; } for(int i=1;i<=n;i++) { if(f[i]==ma) { ans2+=t[i]; } } printf("%d %d",ma,ans2); return 0; }