zoukankan      html  css  js  c++  java
  • UVALive 7061 Dire Wolf 区间dp

    题意:

    有一个猎人和n匹狼

    每个狼有一个自己的攻击力a[i]

    每一个狼还有一个buff 可以给旁边的狼加b[i]攻击力

    如果这匹狼被消灭了 那么这个buff也就不存在了

    猎人每消灭一个狼会受到等同于攻击力的伤害

    问猎人消灭所有的狼能受到的最少伤害

    思路:

    经典区间dp

    如果我们要消灭第[l,r]区间中狼i 那么我们的消耗就是

    dfs(l,i-1)+dfs(i+1,r)+a[i]+b[l-1]+b[r+1]

    整体深搜一遍就行了~

     1 #include<bits/stdc++.h>
     2 #define cl(a,b) memset(a,b,sizeof(a))
     3 #define debug(a) cerr<<#a<<"=="<<a<<endl
     4 using namespace std;
     5 typedef long long ll;
     6 typedef pair<int,int> pii;
     7 
     8 const int maxn=200+10;
     9 const int inf=0x3f3f3f3f;
    10 
    11 int a[maxn],b[maxn];
    12 int dp[maxn][maxn];
    13 
    14 int dfs(int l,int r)
    15 {
    16     if(l>r) return 0;
    17     if(dp[l][r]<inf) return dp[l][r];
    18     for(int i=l;i<=r;i++)
    19     {
    20         dp[l][r]=min(dp[l][r],dfs(l,i-1)+dfs(i+1,r)+a[i]+b[l-1]+b[r+1]);
    21     }
    22     return dp[l][r];
    23 }
    24 
    25 int main()
    26 {
    27     int T,cas=1;
    28     scanf("%d",&T);
    29     while(T--)
    30     {
    31         int n;
    32         scanf("%d",&n);
    33         cl(a,0),cl(b,0),cl(dp,inf);
    34         for(int i=0;i<n;i++)
    35         {
    36             scanf("%d",&a[i]);
    37         }
    38         for(int i=0;i<n;i++)
    39         {
    40             scanf("%d",&b[i]);
    41         }
    42         printf("Case #%d: %d
    ",cas++,dfs(0,n+1));
    43     }
    44     return 0;
    45 }/*
    46 
    47 2
    48 3
    49 3 5 7
    50 8 2 0
    51 10
    52 1 3 5 7 9 2 4 6 8 10
    53 9 4 1 2 1 2 1 4 5 1
    54 
    55 */
  • 相关阅读:
    编写高质量Python代码的59个有效方法
    排序NB三人组(快速排序/堆排序/归并排序)
    排序之插入排序
    编写高质量代码 改善Python程序的91个建议——笔记(三)
    ImportHelper 导出帮助类
    使用Layer弹出一个页面
    MongoDB使用手册
    MVC4设置@Html.BeginForm的ID
    LayerManage
    Layer弹窗返回数据回调
  • 原文地址:https://www.cnblogs.com/general10/p/7241232.html
Copyright © 2011-2022 走看看