hdu 5115 Dire Wolf 区间dp
Posted cjlhy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu 5115 Dire Wolf 区间dp相关的知识,希望对你有一定的参考价值。
题目大意:有n头狼,每头狼初始战力为ai, 每头狼为给相邻的狼加bi 战力,让你规定击杀顺序使得自己受到的伤害最小。
思路:训练的时候一直没有想出来,知道是区间dp,并且知道要枚举最后一头狼,但是始终没有想到如何解决枚举的这头狼
对旁边两个区间的影响。。。 其实dp的时候就可以考虑对两边的影响,将其算入dp中。 还是太菜啦。
转移方程式:f[i][j] = min(f[i][j], dp(i, k - 1) + dp(k + 1, j) + a[i - 1] + a[j + 1]);
#include<bits/stdc++.h> #define LL long long #define fi first #define se second #define mk make_pair #define pii pair<int, int> using namespace std; const int N = 200 + 7; const int M = 1e4 + 7; const int inf = 0x3f3f3f3f; const LL INF = 0x3f3f3f3f3f3f3f3f; const int mod = 1e9 +7; const double eps=1e-6; const double pi=acos(-1); int f[N][N], a[N], ans, n; int dp(int i, int j) { if(i > j) return 0; if(f[i][j] != -1) return f[i][j]; f[i][j] = inf; for(int k = i; k <= j; k++) { f[i][j] = min(f[i][j], dp(i, k - 1) + dp(k + 1, j) + a[i - 1] + a[j + 1]); } return f[i][j]; } int main() { int T; scanf("%d", &T); for(int cas = 1; cas <= T; cas++) { ans = 0; scanf("%d", &n); for(int i = 1; i <= n; i++) for(int j = 1; j <= n; j++) f[i][j] = -1; for(int i = 1; i <= n; i++) { int x; scanf("%d", &x); ans += x; } for(int i = 1; i <= n; i++) { scanf("%d", &a[i]); } a[0] = a[n + 1] = 0; printf("Case #%d: %d ", cas, ans + dp(1, n)); } return 0; } /* 3 3 2 */
以上是关于hdu 5115 Dire Wolf 区间dp的主要内容,如果未能解决你的问题,请参考以下文章