电路布线最大不想交子集比如(1,2)(2,1)

本文介绍了一种用于电路布线问题的算法,该算法旨在寻找一组电路连线的最大不相交子集。通过使用动态规划的方法,算法能够有效地解决这类问题,并提供了完整的C语言实现代码。
/**
 * 电路布线找一个最大不想交子集!比如(1,2),(2,1)最大不想交子集就是1	 
 */

#include<stdio.h>

void MNS(int c[11],int n,int size[11][11]);

int main(){

	int n;
	while(scanf("%d",&n),n){
	
		int c[11]={0};
		int size[11][11]={0};
		for(int i=1;i<=n;i++)
			scanf("%d",&c[i]);
		/*for(int it=1;it<=n;it++)
			printf("%d  ",c[it]);
		putchar('\n');*/
		MNS(c,n,size);
		printf("%d\n",size[n][n]);
		/*for(int ji=1;ji<=n;ji++){
			for(int ij=1;ij<=n;ij++)
				printf("%d  ",size[ji][ij]);
			putchar('\n');
		}*/

	}

	return 0;


}

void MNS(int c[11],int n,int size[11][11]){

	for(int i=1;i<=n;i++)
		if(i<c[1])
			size[i][i]=0;
		else
			size[1][i]=1;
	for(int j=2;j<n;j++){
		for(int k=1;k<c[j];k++)
			size[j][k]=size[j-1][k];
		for(int kk=c[j];kk<=n;kk++)
			size[j][kk]=(size[j-1][kk]>size[j-1][c[j]-1]+1)?size[j-1][kk]:size[j-1][c[j]-1]+1;
	}
	size[n][n]=size[n-1][n]>size[n-1][c[n]-1]+1?size[n-1][n]:size[n-1][c[n]-1]+1;
}
 
 
 

转载于:https://www.cnblogs.com/Acmen/archive/2011/11/13/2247141.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值