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