hdu 5115 Dire Wolf 恐狼先锋

来源:互联网 发布:出租房网络经常掉线 编辑:程序博客网 时间:2024/06/02 12:55

题目含义:有200头狼站成一排,每一头狼有一个自身攻击力a[i],和一个buff(使得左右攻击力提升b[i]),决定一个杀死狼的顺序,使得自身受到伤害值最小。

恐狼先锋!!!!

合并类DP,f[i,j]代表消灭【i,j】区间内的最小消耗,

f[i,j] = f[i,k-1] + f[k+1,j] + a[k] + b[i-1] + b[j+1];  //k为枚举的【i,j】区间内最后杀死的狼。

代码如下:
#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>using namespace std;const int N = 200+10;const int inf = 1000000000;int a[N];int b[N];int f[N][N];int dfs(int i,int j){    if(j<i) return 0;    if(f[i][j]!=-1) return f[i][j];    if(i==j) return f[i][j]=a[i]+b[i-1]+b[j+1];    int ans = inf;    for(int k = i;k<=j;k++)    {        ans = min(ans,dfs(i,k-1)+dfs(k+1,j)+a[k]+b[i-1]+b[j+1]);    }    return f[i][j] = ans;}int main(){    int t,cas=0;    cin>>t;    while(t--)    {        cas++;        int n;        scanf("%d",&n);        memset(a,0,sizeof(a));        memset(b,0,sizeof(b));        memset(f,-1,sizeof(f));        for(int i=1;i<=n;i++) scanf("%d",&a[i]);        for(int i=1;i<=n;i++) scanf("%d",&b[i]);        int ans = dfs(1,n);        printf("Case #%d: %d\n",cas,ans);    }    return 0;}


0 0