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;
}
posted @ 2016-12-25 00:16  啊嘞  阅读(131)  评论(0编辑  收藏  举报