矩阵嵌套问题(DAG上的动态规划)

今天第一次接触动态规划的算法思想,编写了ACM的矩阵嵌套问题
这里写图片描述
算法思想概述:读入数据后存储在HashMap中,根据题目要求计算DAG,并存储在临街矩阵中,然后用记忆化搜索的方法求得DAG上的最长路径即可
核心代码是static int dp(int i)

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Scanner;
/**
 * 南阳理工ACM   矩阵嵌套  
 * DAG上的动态规划   用邻接矩阵保存图
 * */
public class 矩阵嵌套 {
    static int[][] table;
    static HashMap<Integer, Rectangle> recMap;
    static int d[];
    static int include(int x,int y){
        Rectangle r1=recMap.get(x),r2=recMap.get(y);
        if(r1.a<r2.a && r1.b<r2.b)return 1;
        if(r1.a<r2.b && r1.b<r2.a)return 1;
        return 0;
    }
    static int dp(int i){
        if(d[i]>0)return d[i];
        d[i]=1;
        for(int j=1;j<=recMap.size();j++){
            if(table[i][j]>0)d[i]=Math.max(d[i],dp(j)+1);
        }
        return d[i];
    }
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        List<Integer> ansList=new ArrayList<Integer>();
        int num=scanner.nextInt();
        for(int q=1;q<=num;q++){
            int n=scanner.nextInt();
            recMap=new HashMap<Integer, Rectangle>();
            for(int i=1;i<=n;i++){
                recMap.put(i, new Rectangle(scanner.nextInt(), scanner.nextInt()));
            }
            table=new int[n+1][n+1];
            for(int i=1;i<=n;i++)
                for(int j=1;j<=n;j++)
                    table[i][j]=include(i, j);
            d=new int[n+1];
            int max=0;
            for(int i=1;i<=n;i++){
                int dp=dp(i);
                if(dp>max)max=dp;
            }
            ansList.add(max);
        }
        for (Integer integer : ansList) {
            System.out.println(integer);
        }
    }
    static class Rectangle{
        public int a;
        public int b;
        public Rectangle(int a,int b) {
            this.a=a;
            this.b=b;
        }
    }
}

```

在南阳理工的OJ上已经AC,但效率不是最好,请求各位大神给予指点!
第一次发博客,代码中注释太少,以后改正!!~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值