luogu P1108 低价购买
题目链接
题解
朴素n^2dp,对于方案的转移利用加法原理,dp每一种最有解的方案
代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn = 60007;
int f[maxn],c[maxn],a[maxn];
int cnt=0;
int n;
int main() {
scanf("%d",&n);
int i,j;
for(i=1;i<=n;i++)
scanf("%d",a+i);
int ans=0;
for(int i=1;i<=n;++i) {
f[i]=1;
for(int j=1;j<i;++j) {
if(a[i]<a[j])
f[i]=max(f[i],f[j]+1);
ans=std::max(ans,f[i]);
}
}
for(int i=1;i<=n;++i) {
if(f[i]==1)c[i]=1;
for(int j=1;j<i;++j) {
if(f[i]==f[j]&&a[i]==a[j])c[j]=0;
else if(f[j]+1==f[i]&&a[i]<a[j])c[i]+=c[j];
}
}
int cnt=0;
for(int i=1;i<=n;++i) {
if(f[i]==ans)cnt+=c[i];
}
std::cout<<ans<<" "<<cnt<<std::endl;
return 0;
}
/*
12
68 69 54 64 68 64 70 67 78 62
98 87
*/