码迷,mamicode.com
首页 > 其他好文 > 详细

Dire Wolf

时间:2014-12-03 18:51:15      阅读:165      评论:0      收藏:0      [点我收藏+]

标签:style   blog   io   color   os   sp   for   on   div   

·网上说是区间dp,但不是很懂;

·看了别人的解题报告与代码,感觉跟分治比较像

 

解释:

  dp[i][j] 表示 杀从第i头狼到第j头狼所获得的最小伤害;

    for(int i=l+1;i<r;i++){

           dp[l][r] = min(dp[l][r],dfs(l,i) + dfs(i,r) + a[i] + b[l] + b[r]); // 先选择第i头狼

      }

  其中的递推式,是从l+1 ~ r-1 之间,选择先杀某一头狼。  

 

AC Code:

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <algorithm>
 4 #include <cstring>
 5 #include <string.h>
 6 #include <math.h>
 7 #include <queue>
 8 #include <stack>
 9 #include <stdlib.h>
10 #include <map>
11 using namespace std;
12 #define LL long long 
13 #define sf(a) scanf("%d",&(a));
14 //区间dp : f[i][j]代表,从第i个狼到第j个狼,最优策略(感觉有点像分治)
15 #define N 220
16 int a[N],b[N];
17 int dp[N][N];
18 
19 const int INF = 0x3f3f3f3f;
20 
21 int dfs(int l,int r){
22     if(l+1 >= r) return dp[l][r]=0;
23     if(dp[l][r] != INF) return dp[l][r];
24     for(int i=l+1;i<r;i++){
25         dp[l][r] = min(dp[l][r],dfs(l,i) + dfs(i,r) + a[i] + b[l] + b[r]); // 先选择第i头狼
26     }
27     return dp[l][r];
28 }
29 
30 int main(){
31     int k=1,n;
32     int T;scanf("%d",&T);
33     while(T--){
34         //memset(dp,-1,sizeof(dp));
35         printf("Case #%d: ",k++);
36         for(int i=0;i<N;i++)
37             for(int j=0;j<N;j++) dp[i][j] = INF;
38         scanf("%d",&n);
39         for(int i=1;i<=n;i++) scanf("%d",&a[i]);
40         for(int i=1;i<=n;i++) scanf("%d",&b[i]);
41         printf("%d\n",dfs(0,n+1));
42     }
43 
44     return 0;
45 }

 

Dire Wolf

标签:style   blog   io   color   os   sp   for   on   div   

原文地址:http://www.cnblogs.com/songacm/p/4140585.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!