今天第一次接触动态规划的算法思想,编写了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,但效率不是最好,请求各位大神给予指点!
第一次发博客,代码中注释太少,以后改正!!~