AcWing 314. 低买
原题链接
中等
作者:
TaoZex
,
2019-05-28 18:01:58
,
所有人可见
,
阅读 1330
//考虑重复序列的方案数
#include<bits/stdc++.h>
using namespace std;
const int N=5010;
int f[N],g[N],a[N];
int n;
int main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
g[0]=1;
for(int i=1;i<=n;i++){
for(int j=0;j<=n;j++){
if(!j||a[j]>a[i]){
f[i]=max(f[i],f[j]+1);
}
}
for(int j=1;j<i;j++){ //不加就是不考虑重复序列,把重复的都放到相等值最后一项上,每次只算最后一项,就排除了重复序列
if(a[j]==a[i]){
f[j]=0;
}
}
for(int j=0;j<i;j++){
if((!j||a[j]>a[i])&&f[i]==f[j]+1){
g[i]+=g[j]; //累加方案数
}
}
}
int res=0,cnt=0;
for(int i=1;i<=n;i++) res=max(res,f[i]);
for(int i=1;i<=n;i++){
if(f[i]==res){
cnt+=g[i];
}
}
cout<<res<<' '<<cnt<<endl;
return 0;
}
g数组的作用是什么
以第 i 个数为结尾的最长上升子序列方案数
Thank youuuuuuuuuuuuu
f数组的作用是什么
找最长上升子序列LIS
?。
离天~~~