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;
    }
  • 相关阅读:
    .c 文件取为.o文件
    wildcard 处理全部文件
    专家解读Linux操作系统内核中的GCC特性
    Yeoman:适合现代Web应用的现代工作流
    【转】nodejs
    node.js
    2019暑假集训 种树
    2019.6.5 NOIP2014 day2 t2 寻找道路
    2019.6.1 最优贸易
    2019.5.11 海淀区赛之杯子
  • 原文地址:https://www.cnblogs.com/DAIANZE/p/15024630.html
Copyright © 2011-2022 走看看