您的位置:首页 > 其它

HDU 5115 Dire Wolf(区间DP)

2015-11-13 22:15 417 查看
题意:有n只狼,每只狼有两种属性,一种攻击力一种附加值,我们每杀一只狼,那么我们受到的伤害值为

这只狼的攻击值与它旁边的两只狼的附加值的和,求把所有狼都杀光受到的最小的伤害值。

思路:区间DP。用dp[i][j]表示杀死区间[i, j]的狼所需要的最小花费,注意到区间[i, j]的两个边界永远是i-1和j+1,这是由状态转移方程决定的,状态转移方程为dp[i][j] = min(dp[i][k-1] + dp[k+1][r] + b[l-1] + b[r+1]),枚举的k是最后一只杀死的狼。

#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<vector>
#include<map>
#include<queue>
#include<stack>
#include<string>
#include<map>
#include<set>
#include<ctime>
#define eps 1e-6
#define LL long long
#define pii pair<int, int>
//#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;

const int MAXN = 220;
const int INF = 0x3f3f3f3f;
int n;
int a[MAXN], b[MAXN];
int dp[MAXN][MAXN];
int DP(int l, int r) {
if(dp[l][r] != -1) return dp[l][r];
if(l == r) return dp[l][r] = b[l-1] + b[r+1];
int ans = INF;
ans = min(DP(l+1, r), DP(l, r-1));
for(int i = l+1; i < r; i++)
ans = min(ans, DP(l, i-1)+DP(i+1, r));
return dp[l][r] = ans + b[l-1] + b[r+1];
}
int main() {
//freopen("input.txt", "r", stdin);
int T; cin >> T;
int kase = 0;
while(T--) {
cin >> n;
memset(dp, -1, sizeof(dp));
int ans = 0;
for(int i = 1; i <= n; i++) scanf("%d", &a[i]), ans += a[i];
for(int i = 1; i <= n; i++) scanf("%d", &b[i]);
b[0] = b[n+1] = 0;
printf("Case #%d: %d\n", ++kase, DP(1, n)+ans);
}
return 0;
}




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息