【算法】-动态规划02

线性DP

 

 

 算法代码

复制代码
import java.lang.*;
import java.util.*;
public class Main{
    public static int max_len=1;
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int N=sc.nextInt();
        int[] arr=new int[N+1];
        for(int cur=1;cur<=N;cur++){
            arr[cur]=sc.nextInt();
        }
        int[] dp=new int[N+1];
        int res=1;
        for(int i=1;i<=N;i++){
            dp[i]=1;
            for(int j=1;j<i;j++){
                if(arr[j]<arr[i])
                    dp[i]=Math.max(dp[i],dp[j]+1);
            }
            res=Math.max(res,dp[i]);
        }
        System.out.println(res);
    }
   
}
复制代码

 

 

 

 

 

复制代码
import java.lang.*;
import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int len1=sc.nextInt();
        int len2=sc.nextInt();
        char[] str1=sc.next().toCharArray();
        char[] str2=sc.next().toCharArray();
        int[][] dp=new int[len1+1][len2+1];
        for(int i=1;i<=len1;i++){
            for(int j=1;j<=len2;j++){
                    dp[i][j]=Math.max(dp[i-1][j],dp[i][j-1]);
                    if(str1[i-1]==str2[j-1])
                        dp[i][j]=Math.max(dp[i][j],dp[i-1][j-1]+1);
            }
        }
        System.out.println(dp[len1][len2]);
    }
}
复制代码

 区间DP

 

 

 

状态计算公式为f[i.j]=Min(f[i,k]+f[k+1,j]+s[j]-s[i-1]) k从1到j-1

 

 算法代码

复制代码
import java.lang.*;
import java.util.*;
class Main{
    public static void main(String[] args){
        Scanner scanner=new Scanner(System.in);
        int N=scanner.nextInt();
        final int num=301;
        int[] s=new int[num];
        int[][] dp=new int[num][num];
        for(int i=1;i<=N;i++){
            s[i]=scanner.nextInt();
            s[i]+=s[i-1];
        }
       for(int len=1;len<=N;len++){
           for(int i=1;i+len-1<=N;i++){
               int j=i+len-1;
               if(len==1)dp[i][j]=0;
               else{
                   dp[i][j]=Integer.MAX_VALUE;
                for(int k=i;k<j;k++){
                   dp[i][j]=Math.min(dp[i][j],dp[i][k]+dp[k+1][j]+s[j]-s[i-1]);
                    }
               }
           }
       }
        System.out.println(dp[1][N]);
    }
}
复制代码

 

posted @   王广元  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
分享到:
点击右上角即可分享
微信分享提示