动态规划,数字三角型模型

 

import java.util.*;
public class Main{
     public static void main(String args[]) throws Exception {
         int[][] temp = new int[110][110];
         Scanner sc = new Scanner(System.in);
         int k =  sc.nextInt();
         while( k > 0){
             int m = sc.nextInt();
             int n = sc.nextInt();
             for(int i = 1;i <= m;i++){
                 for(int j = 1;j <= n;j++){
                      temp[i][j] = sc.nextInt();
                 }
             }
             
             int[][] dp = new int[m+1][n+1];
            
             for(int i = 1;i <= m;i++){
                 for(int j = 1;j <= n;j++){
                      dp[i][j] = Math.max(dp[i-1][j],dp[i][j-1])+temp[i][j];
                 }
             }
             
             System.out.println(dp[m][n]);
             
             k--;
         }
     }
}

 

import java.util.*;

public class Main{
     public static void main(String args[]) {
           Scanner sc = new Scanner(System.in);
           int n = sc.nextInt();
           int[][] nums = new int[n][n];
           for(int i = 0;i <n;i++){
               for(int j = 0 ; j < n;j++){
                    nums[i][j] = sc.nextInt();
               }
           }
           
           int[][] dp = new int[n][n];
           dp[0][0] = nums[0][0];
           for(int i = 1; i < n;i++){
               dp[i][0] = dp[i-1][0] + nums[i][0];
               dp[0][i] = dp[0][i-1] + nums[0][i];
           }
           
           for(int i = 1; i < n;i++){
               for(int j = 1;j < n;j++){
                    dp[i][j] = Math.min(dp[i-1][j],dp[i][j-1]) + nums[i][j];
               }
           }
           
           System.out.print(dp[n-1][n-1]);
     }
}

 

 

import java.util.*; 
public class Main {   
    public static void main(String[] args)     {     
        Scanner sc=new Scanner(System.in);   
        int n = sc.nextInt();
        int[][] nums = new int[n+1][n+1];
        int[][][][] dp = new int[n+1][n+1][n+1][n+1];
        while (sc.hasNextInt()) {           
            int a=sc.nextInt();            
            int b=sc.nextInt(); 
            int c= sc.nextInt();
            if (b==0&&a==0&&c == 0) {   
                break ;            
             }            
                  nums[a][b] = c;
              }  
              
              for(int i = 1;i < n+1;i++){
                  for(int j = 1;j < n+1;j++){
                      for(int k = 1;k < n+1;k++){
                          for(int f = 1;f < n+1;f++){
                                     int temp1 = Math.max(dp[i-1][j][k-1][f] , dp[i-1][j][k][f-1]);
                                     int temp2 = Math.max(dp[i][j-1][k-1][f] , dp[i][j-1][k][f-1]);
                                 if(i == k && j == f){
                                     dp[i][j][k][f] = Math.max(temp1,temp2) + nums[k][f];
                                 }else{
                                     
                                     dp[i][j][k][f] = Math.max(temp1,temp2) + nums[k][f] + nums[i][j];
                                 }
                          }
                      }
                  }
              }
              
                sc.close();   
                System.out.print(dp[n][n][n][n]);
    
                
                
          } }
             

 

 

 本题实际与上一题类似,传过去不重复传回来,不就是不重复传两次。

import java.util.*;

public class Main{
     public static void main(String args[]){
            Scanner sc = new Scanner(System.in);
            int m = sc.nextInt();
            int n = sc.nextInt();
            int[][] nums = new int[m+2][n+2];
            for(int i = 1;i < m+1;i++){
                for(int j = 1;j < n+1;j++){
                      nums[i][j] = sc.nextInt();
                }
            }
            int[][][][]  dp = new int[m+1][n+1][m+2][n+2];
            for(int i = 1; i < m+1;i++){
                for(int j = 1;j < n+1;j++){
                     for(int k = 1; k < m+1;k++){
                         for(int f = 1; f <n+1;f++){
                                int temp1 = Math.max(dp[i-1][j][k-1][f] , dp[i-1][j][k][f-1]);
                                int temp2 = Math.max(dp[i][j -1][k-1][f] , dp[i][j-1][k][f-1]);
                              if( i == k && j == f){
                                   dp[i][j][k][f] = Math.max(temp1,temp2) +  nums[k][f];
                              }else{
                                   dp[i][j][k][f] = Math.max(temp1,temp2) + nums[k][f] +nums[i][j];
                              }
                         }
                     }
                }
                
            }
            System.out.print(dp[m][n][m][n]);
     }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值