hdu 5115

题意:有一排狼,攻击某只狼狼会受到这只狼的伤害a[i],和周围狼的伤害b[i-1]+b[i+1],然后问你消灭这一排狼,最少受到多少伤害

思路:dp[i][j]表示消灭i-j这些狼所受最少伤害,dp[i][j]=min(dp[i][j],dp[i][k-1]+dp[k+1][j]+a[k]+b[i-1]+b[j+1])

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int inf=1e9+7;
 4 
 5 int a[300],b[300];
 6 int dp[300][300];
 7 
 8 int main(){
 9     int t;
10     int tt=1;
11     scanf("%d",&t);
12     while(t--){
13         int n;
14         scanf("%d",&n);
15         for(int i=1;i<=n;i++) scanf("%d",&a[i]);
16         for(int i=1;i<=n;i++) scanf("%d",&b[i]);
17         b[0]=0;b[n+1]=0;
18         for(int i=1;i<=n;i++){
19             for(int j=i;j<=n;j++){
20                 if(i==j) dp[i][i]=a[i]+b[i-1]+b[i+1];
21                 else dp[i][j]=inf;
22             }
23         }
24         for(int i=1;i<=n;i++){
25             for(int l=1;l<=n;l++){
26                 int r=i+l;
27                 if(r>n) break;
28                 for(int k=l;k<=r;k++){
29                     dp[l][r]=min(dp[l][r],dp[l][k-1]+dp[k+1][r]+a[k]+b[l-1]+b[r+1]);
30                 }
31             }
32         }
33         /*
34         for(int i=1;i<=n;i++){
35             for(int j=i;j<=n;j++){
36                 cout<<i<<" "<<j<<" "<<dp[i][j]<<endl;
37             }
38         }
39         */
40         printf("Case #%d: ",tt++);
41         cout<<dp[1][n]<<endl;
42     }
43 }

 

posted on 2017-07-16 10:41  hhhhx  阅读(148)  评论(0编辑  收藏  举报

导航