HDU 5115 Dire Wolf

传送门:http://acm.hdu.edu.cn/showproblem.php?pid=5115


森林狼嘛,1费11但是可以给相邻的随从加buff,hhh

现在有一列森林狼,你需要A死他们,当然你也会受到伤害每一只森林狼有自己的攻击力a[i],以及对相邻的加成b[i],当一只森林狼挂掉后两边的即成相邻

求消耗最少的血量


区间DP

设f[i][j]为i~j消耗的血量,

f[i][j]=min(f[i][k]+f[k+1][j]+a[k])+b[i-1]+b[j+1] (i<k<j)

这样只能处理区间长度>=3的情况,对于长度=1或=2的情况需要预处理出来


代码如下:

#include<cstdio>
#include<cstring>
#include<iostream>

using namespace std;

	int T;
	int n;
	int a[205],b[205];
	int f[205][205];
	
	
int main()
{
	scanf("%d",&T);
	for (int t=1;t<=T;t++)
	{
		memset(a,0,sizeof(a));
		memset(b,0,sizeof(b));
		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]);
		}
		
		for (int i=1;i<=n;i++)
		{
			f[i][i]=a[i]+b[i-1]+b[i+1];
		}
		
		for (int l=2;l<=n;l++)
		{
			for (int i=1;i+l-1<=n;i++)
			{
				int j=l+i-1;
				f[i][j]=min(f[i+1][j]+a[i],f[i][j-1]+a[j]);
				for (int k=i+1;k<j;k++)
				{
					f[i][j]=min(f[i][j],f[i][k-1]+f[k+1][j]+a[k]);
				}
				f[i][j]+=b[i-1]+b[j+1];
			}
		}
		
		printf("Case #%d: %d\n",t,f[1][n]);
	}
	
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值