//区间DP
//DP[i][j]表示杀死(i,j)区间的狼能受到的最小伤害
//区间长度从1开始扩大
//状态转移方程:边界:DP[i][i] = a[i] + b[i-1] + b [i+1] ;
// 其他:DP[i][j] = min(DP[i][k-1] + a[k] + DP[k+1][j] ) + b[i-1] + b [j+1] ;
//k表示区间中杀死狼k
#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std ;
#define MAX 205
#define N 0x3f3f3f3f
int a[MAX] , b[MAX] ;
int num ;
int DP[MAX][MAX] ;
void dp()
{
int mini , j ;
for(int i = 1 ; i <= num ; i ++)
DP[i][i] = a[i] + b[i-1] + b [i+1] ;
for(int t = 1 ; t < num ; t ++)
{
for(int i = 1 ; i <= num ; i ++)
{
j = i + t ;
if(j > num) j = num ;
mini = N ;
for(int k = i ;k <= j ; k ++)
{
if(DP[i][k-1]+a[k]+DP[k+1][j] < mini)
mini = DP[i][k-1] + a[k] + DP[k+1][j] ;
}
DP[i][j] = mini + b[i-1] + b [j+1] ;
}
}
}
int main()
{
int T ;
scanf("%d",&T) ;
for(int cas = 1 ; cas <= T ; cas ++ )
{
scanf("%d", &num) ;
memset(a , 0 , sizeof(a));
memset(b , 0 , sizeof(b));
for(int i = 1 ; i <= num ; i ++) scanf("%d",&a[i]);
for(int i = 1 ; i <= num ; i ++) scanf("%d",&b[i]);
memset(DP , 0 , sizeof(DP)) ;
dp();
printf("Case #%d: %d\n",cas,DP[1][num]);
}
return 0 ;
}
POJ5115->区间DP
最新推荐文章于 2020-12-20 21:34:20 发布
