60分求调,另一道题改的,有的步骤没用没删
查看原帖
60分求调,另一道题改的,有的步骤没用没删
1613064
hdyzgxy楼主2025/1/25 20:05
#include<bits/stdc++.h>

using namespace std;
const int maxn=100;
int a[maxn];;
int f[maxn];//f[i]代表以a[i]结尾的最长上升子序列长度
int g[maxn];//g[i]代表f[i]是从 f[g[i]]转移过来的 
int h[maxn];//h[i]代表达成f[i]总共有多少种方案 
int n;
int main()
{
	cin >> n;
	for (int i=1;i<=n;i++)
		cin >> a[i];
	for (int i=1;i<=n;i++)
	{//O(n)枚举状态 
		f[i] = 1; h[i] = 1;
		for (int j=1;j<i;j++)
		//O(n)枚举转移 
			if (a[j] < a[i])
			{
				if (f[j] + 1 > f[i])
				{
					f[i] = f[j] + 1;
					g[i] = j; 
					h[i] = h[j];
				}
				else if (f[j] + 1 == f[i]) h[i] += h[j];
			} 
	} 
	int p=1;
	for (int i=2;i<=n;i++)
		if (f[i] > f[p]) p=i;
	cout<<f[p];
	return 0;
}
2025/1/25 20:05
加载中...