zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    C++中数字与字符串之间的转换
    关于安卓启动eclipse错误:找不到元素‘d:devices'的声明
    linux相关解压命令
    泛型
    CRUD工程师---番外篇---反射
    CRUD工程师---设计模式
    AOP切面日志
    CRUD工程师---InnoDB存储引擎
    CRUD工程师---InnoDB存储引擎2
    CRUD工程师---InnoDB存储引擎4(表)
  • 原文地址:https://www.cnblogs.com/fu3638/p/8860341.html
Copyright © 2011-2022 走看看