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;
}
posted @   小队长wtz  阅读(3)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示