1. 程式人生 > >hdu 5115 Dire Wolf 區間dp

hdu 5115 Dire Wolf 區間dp

區間 fir print for () fine scanf include hdu

題目大意:有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\n", cas, ans + dp(1, n)); } return 0; } /* 3 3 2 */

hdu 5115 Dire Wolf 區間dp