HDU-5115-Dire Wolf
本题是经典区间dp。
题目大意:背景无比长。。一个射手要射一群狼。狼有自己本身的攻击值和邻居的狼给它的额外的攻击值。射手把一头狼射杀。自己也会收到与狼攻击值等同的伤害。(本身攻击值+额外获得的攻击值)。当一头狼被射杀。那么它给邻居狼的额外攻击值也会消失。问射手最小获得的伤害是多少。
其实开始我以为是贪心啊哈哈。
因为是经典区间dp嘛。就不多说了。
dp[i][j]表示把i~j头狼射杀完毕后受到的最小伤害点。
我们的目的就是需要确定哪条狼先射杀。
我们枚举区间内的端点就行。
dp[i][j] = min(dp[i][j], dp[i][k - 1] + a[k] + dp[k + 1][j] + b[i - 1] + b[j + 1]);
代表选择先射杀k。加上k本身的攻击值。这里注意我们求的是dp[i][j]。所以获得的额外的伤害值是b[i - 1]和b[j + 1]所给的。
至于i~j之间的给的额外的伤害值都在内部dp[i][k - 1]和dp[k + 1][j]中。
这里注意我们dp[i][j]初始化INF。
我们没有计算dp[i][i]的值。
所以在循环内部的下标处理需要注意。。(emm我这里卡了很久。。)
要考虑到只有一头狼的时候的情况。
也就是长度为1时i = 1, j = 1的情况。。
代码部分:
#include <bits/stdc++.h>
using namespace std;
const int N = 2e2 + 10;
const int INF = 1e9 + 10;
int dp[N][N]<

本文解析了HDU-5115-DireWolf的经典区间动态规划问题,详细阐述了解题思路与算法实现,包括射手射杀狼群以最小化伤害的策略。
最低0.47元/天 解锁文章
918

被折叠的 条评论
为什么被折叠?



