2024.12.23及以前做题记录
低价购买
题意:求一个序列最长下降子序列,及达到最长的方案数,方案不同当且仅当子序列对应位置不完全一样。
做法:考虑 n^2 dp ,用fi表示第i个位置最大是下降子序列的第几项,用gi表示达到i位置最大长度的不同方案数。
首先单纯求最大长度是简单的,要计算方案数,只需要减去相同数字的贡献就可以了,在dp过程中,如果两个位置上的数相同,则保留后面的,因为下标靠后的一定包含下标靠前的所有方案,但是下标靠前的不一定包含后面的方案。
点击查看代码
#include <bits/stdc++.h>
using namespace std;
const int N = 5010;
int n, a[N], f[N], g[N], maxx, ans;
int main()
{
cin >> n;
for (int i = 1; i <= n; i ++)
{
cin >> a[i];
}
for (int i = 1; i <= n; i ++)
{
for (int j = 1; j < i; j ++)
if (a[i] < a[j]) f[i] = max(f[i], f[j] + 1);
if (f[i] == 0) f[i] = 1;
maxx = max(maxx, f[i]);
for (int j = 1; j < i; j ++)
{
if (f[i] == f[j] && a[i] == a[j]) g[j] = 0;
else if (f[j] == f[i] - 1 && a[i] < a[j]) g[i] += g[j];
}
if (g[i] == 0) g[i] = 1;
}
for (int i = 1; i <= n; i ++)
{
if (f[i] == maxx) ans += g[i];
}
cout << maxx << ' ' << ans << endl;
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】