hdu5115Dire Wolf 区间dp

来源:互联网 发布:html中js用函数传值 编辑:程序博客网 时间:2024/04/30 22:50
//给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;    }}
0 0