首页 > 代码库 > Dire Wolf
Dire Wolf
·网上说是区间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 22016 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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。