http://acm.hdu.edu.cn/showproblem.php?pid=5115
2019.5.30
区间dp,O(N^3)能过,攻击一匹狼的花费是这匹狼的攻击力和相邻狼的额外攻击力
#include <stdio.h>
#include <algorithm>
#include <string.h>
#define mem(x,y) memset(x,y,sizeof x)
using namespace std;
const int maxn=1e5+10;
int t,n,a[210],b[210],dp[210][210];
int main()
{
scanf("%d",&t);
for(int ca=1;ca<=t;ca++)
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
b[0]=b[n+1]=0;
for(int i=1;i<=n;i++)
scanf("%d",&b[i]);
mem(dp,0);
for(int i=1;i<=n;i++)
dp[i][i]=a[i]+b[i-1]+b[i+1];
for(int len=1;len<n;len++)
{
for(int i=1,j=len+1;j<=n;i++,j++)
{
dp[i][j]=min(dp[i+1][j]+a[i]+b[i-1]+b[j+1],dp[i][j-1]+a[j]+b[i-1]+b[j+1]);
for(int k=i+1;k<j;k++)
dp[i][j]=min(dp[i][j],dp[i][k-1]+dp[k+1][j]+a[k]+b[i-1]+b[j+1]);
}
}
printf("Case #%d: %d\n",ca,dp[1][n]);
}
return 0;
}