此题其实不用dp也可以,但是最经在学就用了!!!水。。。
1 #include<stdio.h> 2 #include<string.h> 3 4 int min (int x,int y) 5 { 6 return x<y?x:y; 7 } 8 int main () 9 { 10 int T,n,dp[22][20],dp1[22][20]; 11 while(scanf("%d",&T)!=EOF) 12 { 13 for(int i=1;i<=T;i++) 14 { 15 scanf("%d",&n); 16 memset(dp1,0,sizeof(dp)); 17 for(int j=1;j<=n;j++) 18 for(int k=1;k<=3;k++) 19 { 20 scanf("%d",&dp[j][1<<k-1]); 21 dp1[j][1<<k-1]=dp[j][1<<k-1]; 22 } 23 for(int j=2;j<=n;j++) 24 for(int k=1;k<=3;k++) 25 for(int p=1;p<=3;p++) 26 { 27 if((1<<k-1)&(1<<p-1))continue; 28 if(dp[j][(1<<p-1)]==dp1[j][(1<<p-1)]){dp1[j][(1<<p-1)]=dp1[j-1][(1<<k-1)]+dp1[j][(1<<p-1)];} 29 else {dp1[j][(1<<p-1)]=min(dp1[j][(1<<p-1)],dp1[j-1][(1<<k-1)]+dp[j][(1<<p-1)]);} 30 } 31 int max1=20000; 32 for(int j=1;j<=3;j++) 33 if(dp1[n][1<<j-1]<max1) 34 max1=dp1[n][1<<j-1]; 35 printf("Case %d: ",i); 36 printf("%d ",max1); 37 } 38 } 39 }