ACE-Top

导航

E - Neighbor House (dp)

此题其实不用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\n",max1);
37         }
38     }
39 }

 

posted on 2013-08-20 18:53  ACE-Top  阅读(160)  评论(0编辑  收藏  举报