最长上升子序列相关问题笔记

//求最长上升子序列长度

cin>>n;

for(int i=1;i<=n;i++)
	cin>>a[i];

memset(f,0,sizeof(f));

for(int i=1;i<=n;i++)
{

	for(int j=i+1;j<=n;j++)
		if(a[j]>a[i])
			f[j]=max(f[j],f[i]+1);
}


//求最长上升子序列长度和方案
//f[i]表示以i个位置结尾的最长长度
//g[i]代表f[i]这个状态是由哪个状态转移过来的
void dfs(int p)
{
if(p==0)return ;
dfs(g[p];)
cout<<p<<endl;
}

int main(){
cin>>n;
for(int i=1;i<=n;i++)
	cin>>a[i];

memset(f,0,sizeof(f));

for(int i=1;i<=n;i++)
{

	for(int j=i+1;j<=n;j++)
		if(a[j]>a[i])
			if(f[i]+1>f[j])
				{
				f[j]=f[i]+1;
				g[j]=i;
				}
}

int p=1;
for(int i=2;i<=n;i++)
	if(f[i]>f[p])	p=i;

dfs(p);

return 0;
}

//求最长上升子序列的数量
void dfs(int p)
{
if(p==0)return ;
dfs(g[p];)
cout<<p<<endl;
}

int main(){
cin>>n;
for(int i=1;i<=n;i++)
	cin>>a[i];

memset(f,0,sizeof(f));
memset(h,0,sizeof(h));
for(int i=1;i<=n;i++)
{

	for(int j=i+1;j<=n;j++)
		if(a[j]>a[i])
			if(f[i]+1>f[j])
				{
				f[j]=f[i]+1;
				g[j]=i;
				h[j]=h[i];
				}
				else if(f[i]+1==f[j])h[j]+=h[i];
}

int p=1;
for(int i=2;i<=n;i++)
	if(f[i]>f[p])	p=i;

dfs(p);

return 0;
}
posted @ 2021-07-17 19:16  DAIANZE  阅读(43)  评论(0编辑  收藏  举报