[题解][洛谷P1108] 低价购买
题目描述
求最长下降子序列长度,以及最长下降子序列的个数。
(构成的序列一样的时候,视为同一种最长下降子序列)
题解
n不超过5000,n^2复杂度即可解决该问题。
主要在于如何统计最长下降子序列个数。
可以设数组t[i]表示以i为结尾的最长下降子序列个数,在更新f[i]的时候顺便更新。
t[i]=sum(t[j]),当且仅当 a[j] > a[i] 且 f[i] = f[j]+1 。
代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=5007;
int a[N],f[N],t[N];
signed main(){
int n;
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i],t[i]=1,f[i]=1;
for(int i=2;i<=n;i++){
for(int j=1;j<i;j++){
if(a[j]>a[i]){
if(f[i]==f[j]+1)t[i]+=t[j];
else if(f[i]<f[j]+1)f[i]=f[j]+1,t[i]=t[j];
}
if(a[j]==a[i])f[j]=t[j]=0;//注意这里的去重操作
}
}
int ans=1,cnt=0;
for(int i=1;i<=n;i++){
if(f[i]>ans){
ans=f[i];
cnt=t[i];
}
else if(f[i]==ans)cnt+=t[i];
}
cout<<ans<<" "<<cnt<<endl;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App