Day01—数字三角形模型

文章介绍了四个使用Java编写的动态规划问题:计算数字三角形的和、摘花生游戏的最优路径、最低通行费以及方格取数的最大值。每个问题都涉及到二维数组的更新和状态转移方程的应用。
摘要由CSDN通过智能技术生成

Day01

898.数字三角形

在这里插入图片描述

import java.util.*;

public class Main{
    static int[][] w=new int[510][510];
    static int[][] f=new int[510][510];

    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();

        //读入
        for(int i=1;i<=n;i++){
            for(int j=1;j<=i;j++){
                w[i][j]=sc.nextInt();
            }
        }

        f[1][1]=w[1][1];
        for(int i=2;i<=n;i++){
            for(int j=1;j<=i;j++){
                if(i==j) f[i][j]=f[i-1][j-1]+w[i][j];//每行末尾
                else if(j==1) f[i][j]=f[i-1][1]+w[i][j];//每行开头
                else f[i][j]=Math.max(f[i-1][j],f[i-1][j-1])+w[i][j];
            }
        }


        int max=-0x3f3f3f3f;
        for(int i=1;i<=n;i++){
            if(max<f[n][i]) max=f[n][i];
        }

        System.out.println(max);

    }
}

1015.摘花生

在这里插入图片描述

import java.util.*;

public class Main{
    static int[][] w=new int[110][110];
    static int[][] f=new int[110][110];

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

        while(T--!=0){
            //读入
            int r=sc.nextInt(),c=sc.nextInt();
            for(int i=1;i<=r;i++){
                for(int j=1;j<=c;j++){
                    w[i][j]=sc.nextInt();
                }
            }

            //dp
            for(int i=1;i<=r;i++){
                for(int j=1;j<=c;j++){
                    f[i][j]=Math.max(f[i-1][j],f[i][j-1])+w[i][j];
                }
            }

            System.out.println(f[r][c]);
        }

    }
}

1018.最低通行费

在这里插入图片描述

import java.util.*;

public class Main{
    static int[][] w=new int[110][110];
    static int[][] f=new int[110][110];
    static int INF=0x3f3f3f3f;

    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();

        //读入
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                w[i][j]=sc.nextInt();
            }
        }

        //处理边界
        for(int i=0;i<=n;i++){
            f[0][i]=INF;
            f[i][0]=INF;
        }

        //dp
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                if(i==1&&j==1) f[1][1]=w[1][1];
                else f[i][j]=Math.min(f[i-1][j],f[i][j-1])+w[i][j];//状态转方程
            }
        }

        System.out.println(f[n][n]);
    }
}

1027.方格取数

在这里插入图片描述

import java.util.*;

public class Main{
    static int[][] w=new int[11][11];
    static int[][][] f=new int[11*2][11][11];

    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int a,b,c;

        do{
            a=sc.nextInt();b=sc.nextInt();c=sc.nextInt();
            w[a][b]=c;
        }while(a!=0&&b!=0&&c!=0);


        for(int k=2;k<=n*2;k++){
            for(int i1=1;i1<=n;i1++){
                for(int i2=1;i2<=n;i2++){
                    int j1=k-i1,j2=k-i2;
                    if(j1>=1&&j2>=1&&j2<=n&&j1<=n){
                        int t=w[i1][j1];
                        if(i1!=i2) t+=w[i2][j2];
                        f[k][i1][i2]=Math.max(f[k][i1][i2],f[k-1][i1][i2]+t); //左左  
                        f[k][i1][i2]=Math.max(f[k][i1][i2],f[k-1][i1][i2-1]+t);//左上
                        f[k][i1][i2]=Math.max(f[k][i1][i2],f[k-1][i1-1][i2]+t);//上左
                        f[k][i1][i2]=Math.max(f[k][i1][i2],f[k-1][i1-1][i2-1]+t);//上上
                    }
                }
            }
        }

        System.out.println(f[n*2][n][n]);

    }
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值