hdu5115-Dire Wolf
题目链接请戳 这里
解题思路
设\(dp[i][j]\)表示区间\([i,j]\)的最小伤害。
每次决策,枚举最后杀掉的狼,则转移方程为: $$dp[i][j]=min{dp[i][k-1]+dp[k+1][j]+b[i-1]+a[k]+b[j+1]}$$
其中对\(dp\)数组的初始化:$$dp[i][j]=\begin{cases} b[i-1]+a[i]+b[i+1] &\text{\(i=j\)} \ inf &\text{\(i<j\)} \ 0 &\text{\(other\)}\end{cases}$$
代码
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define N 210
#define INF 1e9
using namespace std;
int dp[N][N];
int a[N],b[N];
int n;
int main()
{
int t;
int ca = 0;
scanf("%d", &t);
while (t--) {
ca++;
scanf("%d", &n);
for (int i=1; i<=n; i++) scanf("%d", &a[i]);
for (int i=1; i<=n; i++) scanf("%d", &b[i]);
for (int i=0; i<=n+1; i++)
for (int j=i; j<=n+1; j++) dp[i][j]=INF;
for (int i=1; i<=n; i++) dp[i][i]=b[i-1]+a[i]+b[i+1];
for (int d=1; d<=n; d++)
for (int i=1; i<=n; i++) {
int j=i+d;
for (int k=i; j<=n && k<=j; k++)
dp[i][j] = min(dp[i][j], dp[i][k-1]+dp[k+1][j]+b[i-1]+a[k]+b[j+1]);
}
printf("Case #%d: %d\n", ca, dp[1][n]);
}
return 0;
}