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

/**

 * 电路布线找一个最大不想交子集!比如(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;

}
 
 
 

你可能感兴趣的:(电路布线最大不想交子集比如(1,2)(2,1))