1. 程式人生 > 其它 >最長上升子序列相關問題筆記

最長上升子序列相關問題筆記

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

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;
}