Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2575 Accepted Submission(s): 1135
1 /*@code龚细军*/ 2 #include<stdio.h> 3 #include<string.h> 4 #define maxn 301 5 int peo[maxn][maxn]; 6 int dp[maxn]; 7 8 int max(int const a,int const b) 9 { 10 return a>b?a:b; 11 } 12 13 int main() 14 { 15 int i,n,j,k; 16 while(scanf("%d",&n)!=EOF) 17 { 18 memset(dp,0,(n+1)*sizeof(int)); 19 for(i=1;i<=n;i++) 20 { 21 for(j=1;j<=n;j++) 22 scanf("%d",&peo[i][j]); 23 } 24 for(i=1;i<=n;i++) 25 { 26 for(j=n;j>=0;j--) 27 { 28 for(k=0;k<=j;k++) 29 { 30 dp[k]=max(dp[k],dp[j-k]+peo[i][k]); 31 } 32 } 33 34 } 35 printf("%d\n",dp[n]); 36 } 37 return 0; 38 }
下面是有km最大匹配算法来做的。。。。
代码:
//二分图最佳匹配,kuhn munkras算法,邻接阵形式,复杂度O(m*n*m); /*返回最佳匹配值,传入二分图的大小,m,n和邻接阵mat,表示权值
1 /*@coder龚细军*/ 2 #include<stdio.h> 3 #include<string.h> 4 #define MAX 305 5 #define inf 1000000000 6 7 int km(int n, int mat[][MAX],int *match1,int *match2 ) 8 { 9 int s[MAX],t[MAX],lx[MAX]={0},ly[MAX],p,q,ret=0,i,j,k; 10 for( i=0; i<n ; i++) 11 { 12 for(lx[i]=-inf,j=0 ; j<n ;j++) 13 { 14 lx[i]=mat[i][j]>lx[i]?mat[i][j]:lx[i]; 15 } 16 } 17 memset(ly,0,n*sizeof(int)); /*节约大把的时间是不*/ 18 memset(match1,0xff,sizeof(int)*n); 19 memset(match2,0xff,sizeof(int)*n); 20 for(i=0 ; i<n ;i++) 21 { 22 memset(t,0xff,sizeof(int)*n); 23 p=q=0; 24 for(s[p]=i;p<=q&&match1[i]<0 ; p++) 25 { 26 for(k=s[p],j=0; j<n&&match1[i]<0 ;j++) 27 { 28 if(lx[k]+ly[j]==mat[k][j]&&t[j]<0) 29 { 30 s[++q]=match2[j]; 31 t[j]=k; 32 if(s[q]<0) 33 for(p=j ; p>=0 ; j=p) 34 { 35 match2[j]=k=t[j]; 36 p=match1[k]; 37 match1[k]=j; 38 } 39 } 40 } 41 } 42 if(match1[i]<0) 43 { 44 for(i--,p=inf,k=0; k<=q; k++) 45 { 46 for(j=0; j<n; j++) 47 { 48 if(t[j]<0&&lx[s[k]]+ly[j]-mat[s[k]][j]<p) 49 p=lx[s[k]]+ly[j]-mat[s[k]][j]; 50 } 51 } 52 for(j=0;j<n;ly[j]+=t[j]<0?0:p,j++); 53 for(k=0; k<=q ; lx[s[k++]]-=p); 54 } 55 } 56 for(i=0;i<n;i++) 57 { 58 ret+=mat[i][match1[i]]; 59 } 60 return ret; 61 } 62 int map[MAX][MAX],aa[MAX],bb[MAX]; 63 int main() 64 { 65 int n,i,j; 66 while(scanf("%d",&n)!=EOF) 67 { 68 for(i=0;i<n;i++) 69 { 70 for(j=0;j<n;j++) 71 { 72 scanf("%d",&map[i][j]); 73 } 74 } 75 printf("%d\n",km(n,map,aa,bb)); 76 } 77 return 0; 78 }