您的位置:首页 > 编程语言 > Java开发

动态规划排线算法问题java语言实现 在一块电路板的上、下2端分别有n个接线柱。根据电路设计,要求用导线(i,π(i))将上端接线柱与下端接线柱相连

2015-10-30 16:35 971 查看
动态规划排线算法问题java语言实现 问题描述:在一块电路板的上、下2端分别有n个接线柱。根据电路设计,要求用导线(i,π(i))将上端接线柱与下端接线柱相连,确定将哪些连线安排在第一层上,使得该层上有尽可能多的连线。该问题要求确定导线集Nets={(i,π(i)),1≤i≤n}的最大不相交子集java语言
//动态规划排线算法
public class DynamicAlorithm {
	
	//求最大值
	public static int MAX(int a,int b) {
		int max=a>b?a:b;
		return max;
	}
	
	public static void Circut_Alorithm(int[] a, int [][]set, int n) {
			int i, j;

			for (i = 0; i < n; i++)
			{
				set[i][0] = 0;
				set[0][i] = 0;
			}

			for (i = 1; i <= n; i++)
			{
				for (j = 1; j <= n; j++)
				{
				    //考虑两种情况
					if (a[i] != j)
						set[i][j] = MAX(set[i - 1][j], set[i][j - 1]);
					else
						set[i][j] = set[i - 1][j - 1] + 1;
				}
			}
		
	}
	//回调递归计算最大不相交连线的电路排线并输出回路内容
	public static void Print_Circut(int i, int j, int set[][]){
			if (i == 0)
				return;
			if (set[i][j] == set[i - 1][j])
				Print_Circut(i - 1, j, set);
			else if (set[i][j] == set[i][j - 1])
				Print_Circut(i, j - 1, set);
			else
			{
				Print_Circut(i - 1, j - 1, set);
				System.out.println(" <"+i+"--"+j+"> ");
			}
		
	}
    public static void main(String[]args) {
    	//初始化
    	int a[] = { 0, 6, 3, 5, 2, 9, 4, 1, 10, 7, 8 };
    	int set[][]=new int[11][11];

    	Circut_Alorithm(a, set, 10);
        System.out.println("最大不相交连线的个数:"+set[10][10]);
        System.out.println("最大不相交连线的电路排线如下:");
        Print_Circut(10, 10, set);
	}

}
结果截图:

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: