zoukankan      html  css  js  c++  java
  • 最长上升子序列相关问题笔记

    //求最长上升子序列长度
    
    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;
    }
  • 相关阅读:
    javascript对话框
    重构之美-走在Web标准化设计的路上[复杂表单]
    xhtml标准下的height:100%
    javascript简洁的LightBox
    Web标准学习书籍推荐
    Email
    jQuery插件Cookie
    Linq to sql 简单性能差异指引 2 (转)
    jQuery Impromptu
    UI
  • 原文地址:https://www.cnblogs.com/DAIANZE/p/15024630.html
Copyright © 2011-2022 走看看