Day02—最长上升子序列模型1

Day02

895.最长上升子序列

在这里插入图片描述

import java.util.*;

public class Main{
    static Scanner sc=new Scanner(System.in);
    static int[] a=new int[1010];
    static int[] f=new int[1010];
    
    public static void main(String[] args){
        int n=sc.nextInt();
        
        for(int i=1;i<=n;i++) a[i]=sc.nextInt();
        
        int res=0;
        for(int i=1;i<=n;i++){
            f[i]=1;
            for(int j=1;j<i;j++){
                if(a[i]>a[j]){
                    f[i]=Math.max(f[i],f[j]+1);
                }
            }
            res=Math.max(res,f[i]);
        }
        
        System.out.println(res);
        
    }
}

1017. 怪盗基德的滑翔翼

在这里插入图片描述

import java.util.*;

public class Main{
    static Scanner sc=new Scanner(System.in);
    static int[] a=new int[110];
    static int[] f=new int[110];

    public static void main(String[] args){
        int T=sc.nextInt();

        while(T--!=0){
            int n=sc.nextInt();

            for(int i=1;i<=n;i++) a[i]=sc.nextInt();

            int res=0;
            for(int i=1;i<=n;i++){//dp左边求最长上升子序列
                f[i]=1;
                for(int j=1;j<i;j++){
                    if(a[i]>a[j]){
                        f[i]=Math.max(f[i],f[j]+1);
                    }
                }

                res=Math.max(f[i],res);
            }

            for(int i=n;i>=1;i--){//dp右边求最长上升子序列
                f[i]=1;
                for(int j=n;j>i;j--){
                    if(a[i]>a[j]){
                        f[i]=Math.max(f[i],f[j]+1);
                    }
                }
                res=Math.max(res,f[i]);
            }

            System.out.println(res);

        }
    }
}

1014. 登山

在这里插入图片描述

import java.util.*;

public class Main{
    static Scanner sc=new Scanner(System.in);
    static int[] a=new int[1010];
    static int[] f=new int[1010];
    static int[] g=new int[1010];
    public static void main(String[] args){
        int n=sc.nextInt();
        
        for(int i=1;i<=n;i++) a[i]=sc.nextInt();
        
        for(int i=1;i<=n;i++){//从左边求最长上升子序列
            f[i]=1;
            for(int j=1;j<i;j++){
                if(a[i]>a[j]){
                    f[i]=Math.max(f[i],f[j]+1);
                }
            }
        }
        
        for(int i=n;i>=1;i--){//从右边求最长上升子序列
            g[i]=1;
            for(int j=n;j>i;j--){
                if(a[i]>a[j]){
                    g[i]=Math.max(g[i],g[j]+1);
                }
            }
        }
        
        
        int res=0;
        for(int i=1;i<=n;i++) res=Math.max(res,f[i]+g[i]-1);
        
        System.out.println(res);
        
    }
}

482. 合唱队形

在这里插入图片描述

import java.util.*;

public class Main{
    static Scanner sc=new Scanner(System.in);
    static int[] a=new int[110];
    static int[] f=new int[110];
    static int[] g=new int[110];
    
    public static void main(String[] args){
        int n=sc.nextInt();
        
        for(int i=1;i<=n;i++) a[i]=sc.nextInt();
        
        for(int i=1;i<=n;i++){
            f[i]=1;
            for(int j=1;j<i;j++){
                if(a[i]>a[j]){
                    f[i]=Math.max(f[i],f[j]+1);
                }
            }
        }
        
        for(int i=n;i>=1;i--){
            g[i]=1;
            for(int j=n;j>i;j--){
                if(a[i]>a[j]){
                    g[i]=Math.max(g[i],g[j]+1);
                }
            }
        }
        
        
        int res=0;
        for(int i=1;i<=n;i++) res=Math.max(res,g[i]+f[i]-1);
        
        System.out.println(n-res);
        
    }
}

1012. 友好城市

在这里插入图片描述

import java.util.*;
public class Main{
    static Scanner sc = new Scanner(System.in);
    static int N = 5010;
    static int[] f = new int[N];
    static PII[] a = new PII[N];
    public static void main(String[] args){
       
        int n = sc.nextInt();
        
        for(int i = 1; i <= n ; i ++ ){
            a[i] = new PII(sc.nextInt(),sc.nextInt());
        }
        
        Arrays.sort(a,1,n+1);

        int res = 0;
        for(int i = 1 ; i <= n ; i ++ ){
            f[i] = 1;
            for(int j = 1 ; j < i; j ++ ){
                if(a[i].x > a[j].x){
                    f[i] = Math.max(f[i],f[j] + 1);
                }
            }
            res = Math.max(res,f[i]);
        }
        System.out.println(res);
    }
    
}

class PII implements Comparable<PII>{
    int x,y;
    public PII(int x,int y){
        this.x = x;
        this.y = y;
    }
    public int compareTo(PII o){
        return Integer.compare(y,o.y);
    }
}

1016. 最大上升子序列和

在这里插入图片描述

import java.util.*;

public class Main{
    static Scanner sc=new Scanner(System.in);
    static int[] a=new int[1010];
    static int[] f=new int[1010];
    
    public static void main(String[] args){
        int n=sc.nextInt();
        
        for(int i=1;i<=n;i++) a[i]=sc.nextInt();
        
        for(int i=1;i<=n;i++){
            f[i]=a[i];
            for(int j=1;j<i;j++){
                if(a[i]>a[j]){
                    f[i]=Math.max(f[i],f[j]+a[i]);
                }
            }
        }
        
        int res=0;
        for(int i=1;i<=n;i++) res=Math.max(res,f[i]);
        System.out.println(res);
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值