http://acm.hdu.edu.cn/showproblem.php?pid=5115
题目大意:
有n匹狼,每次击杀其中的一匹需要耗费对方的a[i]值以及相邻两匹狼的b[i]值,问要如何击杀,才能让最后耗费最少?
解题思路:
区间dp。刚开始想的是贪心,但是总是过不了。
dp[i][j]表示击杀区间[i,j]中的狼最少耗费
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<map>
#include<set>
#include<cstdio>
#include<cmath>
using namespace std;
typedef long long ll;
#define mod 1000000007
#define INF 0x3f3f3f3f
const int maxn=200+10;
int a[maxn],b[maxn],dp[maxn][maxn];
int main()
{
int t,n,tt=0;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
ll sum=0;
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]),sum+=a[i];
for(int i=1;i<=n;i++)
scanf("%lld",&b[i]);
b[0]=b[n+1]=0;
for(int len=1;len<=n;len++)
for(int i=1;i+len-1<=n;i++)
{
int j=i+len-1;
dp[i][j]=INF;
for(int k=i;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: %lld\n",++tt,dp[1][n]);
}
return 0;
}