hdu5115Dire Wolf 区间dp

//给n条狼 ,杀每条狼都会对自己有一个伤害值
//而且相邻两只狼可以对对方的伤害有增益
//当一只狼被杀了后,原来与它相邻的狼相邻
//给出每只狼的伤害值和每只狼对相邻狼的增益值
//问怎样安排杀狼顺序使得受到的伤害值最小
//dp[i][j]表示从i开始的长度为j的区间所有狼被杀的受到的最小伤害
//dp[i][j] = min( dp[i][k-1] + a[i+k-1] + dp[i+k][j-k]+b[i-1]+b[i+j])
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std ;
const int maxn = 210 ;
const int inf = 0x7fffffff ;
int dp[maxn][maxn] ;
int a[maxn]  ;
int b[maxn] ;
int main()
{
 int t ;
 scanf("%d" , &t) ;
 int cas = 0 ;
 while(t--)
 {
 int n ;
 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]) ;
 b[0] = 0 ;
 b[n+1] = 0 ;
 for(int i = 1;i <= n;i++)
 dp[i][0] = 0 ;
 for(int j = 1;j <= n;j++)
 for(int i = 1;i <= n-j+1;i++)
 {
 int mi = inf ;
 for(int k = 1;k <= j;k++)
 mi = min(mi , dp[i][k-1] + a[i+k-1] + dp[i+k][j-k]) ;
 dp[i][j] = mi + b[i-1] + b[i + j] ;
 }
 printf("Case #%d: " ,++cas) ;
 cout<<dp[1][n]<<endl;
 }
}

你可能感兴趣的:(dp)