HDU 5115 Dire Wolf (区间DP)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5115

题目大意:
有一些狼,从左到右排列,每只狼有一个伤害A,还有一个伤害B。杀死一只狼的时候,会受到这只狼的伤害A和这只狼两边的狼的伤害B的和。
若两只狼之间的狼都被杀了,这两只狼也算相邻。求杀掉一排狼的最小代价。
解题思路:
设dp[i][j]为消灭编号从i到j只狼的代价,那么结果就是dp[1][n]
枚举k作为最后一只被杀死的狼,此时会受到a[k]和b[i-1] b[j+1]的伤害 取最小的即可。
可列出转移方程:dp[i][j]=min(dp[i][j], dp[i][k-1]+dp[k+1][j]+a[k]+b[i-1]+b[j+1])
        dp[i][i]=a[i]+b[i-1]+b[j+1];
开始还是没有想明白,枚举k的意义是什么,结果把状态转移方程写错了。

代码:

 1 #include<cstdio>
 2 #include<cmath>
 3 #include<cctype>
 4 #include<cstring>
 5 #include<iostream>
 6 #include<algorithm>
 7 #include<vector>
 8 #include<queue>
 9 #include<set>
10 #include<map>
11 #include<stack>
12 #include<string>
13 #define lc(a) (a<<1)
14 #define rc(a) (a<<1|1)
15 #define MID(a,b) ((a+b)>>1)
16 #define fin(name)  freopen(name,"r",stdin)
17 #define fout(name) freopen(name,"w",stdout)
18 #define clr(arr,val) memset(arr,val,sizeof(arr))
19 #define _for(i,start,end) for(int i=start;i<=end;i++)
20 #define FAST_IO ios::sync_with_stdio(false);cin.tie(0);
21 using namespace std;
22 typedef long long LL;
23 const int N=1e3+5;
24 const int INF=0x3f3f3f3f;
25 const double eps=1e-10;
26 
27 int a[N],b[N];
28 int dp[N][N];
29 
30 int main(){
31     FAST_IO;
32     int t,cas=0;
33     cin>>t;
34     while(t--){
35         memset(dp,0,sizeof(dp));
36         memset(b,0,sizeof(b));
37         int n;
38         cin>>n;
39         for(int i=1;i<=n;i++){
40             cin>>a[i];
41         }
42         for(int i=1;i<=n;i++){
43             cin>>b[i];
44         }
45         for(int i=1;i<=n;i++){
46             dp[i][i]=a[i]+b[i-1]+b[i+1];
47         }
48         for(int len=1;len<n;len++){
49             for(int i=1;i+len<=n;i++){
50                 int j=i+len;
51                 dp[i][j]=INF;
52                 //枚举k作为最后一只被杀死的狼
53                 for(int k=i;k<=j;k++){
54                     dp[i][j]=min(dp[i][j],dp[i][k-1]+dp[k+1][j]+a[k]+b[i-1]+b[j+1]);
55                 }
56             }
57         }
58         printf("Case #%d: %d
",++cas,dp[1][n]);
59     }
60     return 0;
61 }
原文地址:https://www.cnblogs.com/fu3638/p/8860341.html