HDU-5115 Dire Wolfs (区间DP)

Dire Wolf

Time Limit: 5000/5000 MS (Java/Others)    Memory Limit: 512000/512000 K (Java/Others)
Total Submission(s): 1561    Accepted Submission(s):
897

Problem Description

Dire wolves, also known as Dark wolves, are
extraordinarily large and powerful wolves. Many, if not all, Dire Wolves appear
to originate from Draenor.
Dire wolves look like normal wolves, but these
creatures are of nearly twice the size. These powerful beasts, 8 - 9 feet long
and weighing 600 - 800 pounds, are the most well-known orc mounts. As tall as a
man, these great wolves have long tusked jaws that look like they could snap an
iron bar. They have burning red eyes. Dire wolves are mottled gray or black in
color. Dire wolves thrive in the northern regions of Kalimdor and in
Mulgore.
Dire wolves are efficient pack hunters that kill anything they
catch. They prefer to attack in packs, surrounding and flanking a foe when they
can.
— Wowpedia, Your wiki guide to the World of Warcra

Matt, an
adventurer from the Eastern Kingdoms, meets a pack of dire wolves. There are N
wolves standing in a row (numbered with 1 to N from left to right). Matt has to
defeat all of them to survive.

Once Matt defeats a dire wolf, he will
take some damage which is equal to the wolf’s current attack. As gregarious
beasts, each dire wolf i can increase its adjacent wolves’ attack by
bi. Thus, each dire wolf i’s current attack consists of two parts,
its basic attack ai and the extra attack provided by the current adjacent
wolves. The increase of attack is temporary. Once a wolf is defeated, its
adjacent wolves will no longer get extra attack from it. However, these two
wolves (if exist) will become adjacent to each other now.

For example,
suppose there are 3 dire wolves standing in a row, whose basic attacks ai are
(3, 5, 7), respectively. The extra attacks bi they can provide are
(8, 2, 0). Thus, the current attacks of them are (5, 13, 9). If Matt defeats the
second wolf first, he will get 13 points of damage and the alive wolves’ current
attacks become (3, 15).

As an alert and resourceful adventurer, Matt can
decide the order of the dire wolves he defeats. Therefore, he wants to know the
least damage he has to take to defeat all the wolves.

Input

The first line contains only one integer T , which
indicates the number of test cases. For each test case, the first line contains
only one integer N (2 ≤ N ≤ 200).

The second line contains N integers
ai (0 ≤ ai ≤ 100000), denoting the basic attack of each
dire wolf.

The third line contains N integers bi (0 ≤
bi ≤ 50000), denoting the extra attack each dire wolf can
provide.

Output

For each test case, output a single line “Case #x: y”,
where x is the case number (starting from 1), y is the least damage Matt needs
to take.

Sample Input

2
3
3 5 7
8 2 0
10
1 3 5 7 9 2 4 6 8 10
9 4 1 2 1 2 1 4 5 1

Sample Output

Case #1: 17
Case #2: 74

Hint

In the ?rst sample, Matt defeats the dire wolves from left to right. He takes 5 + 5 + 7 = 17 points of damage which is the least damage he has to take.

题目大意(转自别人):有n头狼排成一排, 每只狼都对相邻的狼的攻击力有加成作用, 每杀死一只狼所受到的伤害为当前狼的攻击力(算上加成的部分), 被杀死之后的狼对相邻的狼的攻击力的加成会被取消, 同时, 原先与被杀死的狼相邻的两头狼会变成相邻的狼。 要求使得受到的伤害值最小, 求出最小值

为了保证每天至少AC两道题,我无奈又水了一道区间动归题 0.0

 1 #include <cstdio>
 2 #include <cmath>
 3 #include <cstring>
 4 #include <cstdlib>
 5 #include <queue>
 6 #include <stack>
 7 #include <vector>
 8 #include <iostream>
 9 #include "algorithm"
10 using namespace std;
11 typedef long long LL;
12 const int MAX=205;
13 int t;
14 int n;
15 int a[MAX],b[MAX];
16 int f[MAX][MAX];
17 void init(){
18     int i,j;
19     scanf ("%d",&n);
20     memset(f,0,sizeof(f));
21     memset(a,0,sizeof(a));
22     memset(b,0,sizeof(b));
23     for (i=1;i<=n;i++)
24      scanf("%d",a+i);
25     for (i=1;i<=n;i++)
26      scanf("%d",b+i);
27     for (i=1;i<=n;i++)
28      f[i][i]=a[i]+b[i-1]+b[i+1];
29 }
30 int main(){
31     freopen ("wolf.in","r",stdin);
32     freopen ("wolf.out","w",stdout);
33     int zt(0);
34     scanf("%d",&t);
35     while (t--){
36     init();
37     int len,i,j,k;
38     for (len=2;len<=n;len++)
39      for (i=1;i<=n-len+1;i++)
40      {j=i+len-1;
41       f[i][j]=min(b[i-1]+a[i]+f[i+1][j]+b[j+1],b[i-1]+f[i][j-1]+a[j]+b[j+1]);
42       for (k=i+1;k<j;k++)
43        f[i][j]=min(f[i][j],b[i-1]+f[i][k-1]+a[k]+f[k+1][j]+b[j+1]);
44      }
45     printf("Case #%d: %d\n",++zt,f[1][n]);
46     }
47     return 0;
48 }
时间: 2024-12-31 03:48:57

HDU-5115 Dire Wolfs (区间DP)的相关文章

【DP】 HDU 5115 Dire Wolf 区间DP

点击打开链接 题意:一头狼的攻击力= 自己攻击力+相邻两边的狼的加成 每杀一头狼会收到一次攻击 求受到的攻击和最小 比较裸的区间DP #include <cstdio> #include <cstring> #include <cstdlib> #include <string> #include <iostream> #include <algorithm> #include <sstream> #include <

HDU 5115 Dire Wolf 区间DP

Dire Wolf Problem Description Dire wolves, also known as Dark wolves, are extraordinarily large and powerful wolves. Many, if not all, Dire Wolves appear to originate from Draenor.Dire wolves look like normal wolves, but these creatures are of nearly

HDOJ 5115 Dire Wolf 区间DP

区间DP Dire Wolf Time Limit: 5000/5000 MS (Java/Others)    Memory Limit: 512000/512000 K (Java/Others) Total Submission(s): 44    Accepted Submission(s): 30 Problem Description Dire wolves, also known as Dark wolves, are extraordinarily large and power

HDU 4632 Palindrome subsequence(区间dp,回文串,字符处理)

题目 参考自博客:http://blog.csdn.net/u011498819/article/details/38356675 题意:查找这样的子回文字符串(未必连续,但是有从左向右的顺序)个数. 简单的区间dp,哎,以为很神奇的东西,其实也是dp,只是参数改为区间,没做过此类型的题,想不到用dp,以后就 知道了,若已经知道[0,i],推[0,i+1], 显然还要从i+1 处往回找,dp方程也简单: dp[j][i]=(dp[j+1][i]+dp[j][i-1]+10007-dp[j+1][

hdu 5115 Dire Wolf(区间dp)

Problem Description Dire wolves, also known as Dark wolves, are extraordinarily large and powerful wolves. Many, if not all, Dire Wolves appear to originate from Draenor. Dire wolves look like normal wolves, but these creatures are of nearly twice th

动态规划(区间DP):HDU 5115 Dire Wolf

Dire wolves, also known as Dark wolves, are extraordinarily large and powerful wolves. Many, if not all, Dire Wolves appear to originate from Draenor. Dire wolves look like normal wolves, but these creatures are of nearly twice the size. These powerf

HDU 5115 Dire Wolf ——(区间DP)

比赛的时候以为很难,其实就是一个区间DP= =..思路见:点我. 区间DP一定要记住先枚举区间长度啊= =~!因为区间dp都是由短的区间更新长的区间的,所以先把短的区间更新完.. 代码如下: 1 #include <stdio.h> 2 #include <algorithm> 3 #include <string.h> 4 using namespace std; 5 const int N = 200 + 5; 6 const int inf = 0x3f3f3f3

HDU5115 Dire Wolf (区间DP)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5115 题意: 有n只狼,每只狼有两种属性,一种攻击力一种附加值,我们没杀一只狼,那么我们受到的伤害值为 这只狼的攻击值与它旁边的两只狼的附加值的和,求把所有狼都杀光受到的最小的伤害值. 分析: 赤裸裸的区间DP dp[i][j]表示把区间i,j内的所有狼杀光所受到的最小的伤害. 状态转移方程为 dp[i][j]=min{dp[i][k]+dp[k+1][j]-b[k]+b[i+1],dp[i][k

HDU 5396 Expression (区间DP)

链接 : http://acm.hdu.edu.cn/showproblem.php?pid=5396 设d[i][j] 代表i~j的答案.区间DP枚举(i, j)区间的断点,如果断点处的操作符是'*',那么该区间的答案可以直接加上d[i][k] *  d[k+1][j],因为乘法分配律可以保证所有的答案都会乘起来.如果是加法,需要加的 就是 左边的答案 乘 右边操作数的阶乘 加上 右边的答案乘左边操作数的阶乘,最后要确定左边操作和右边操作的顺序 因为每个答案里是统计了该区间所有的阶乘情况,因此