hdu 5115 区间dp 狼BUFF



题目大意:你是一个战士现在面对,一群狼,每只狼都有一定的主动攻击力和附带攻击力。你杀死一只狼。你会受到这只狼的(主动攻击力+旁边两只狼的附带攻击力)这么多伤害~现在问你如何选择杀狼的顺序使的杀完所有狼时,自己受到的伤害最小。(提醒,狼杀死后就消失,身边原本相隔的两只狼会变成相邻,而且不需要考虑狼围城环这种情况)


输入要求:总共T组数据,每组N只狼,按顺序输入全部狼的主动攻击力和然后再按顺序输入全部狼的附带攻击力


输出要求:Case #x: y x第几组数据,y最少受到的伤害


思路引导:首先所有狼的主动攻击一定是必须全部加上的然后,然后就是调整附带伤害的顺序来求出最小值。 


dp[l][r]代表l-r受到的伤害总和,dp[l][r]=min(dp[l][r],dp[l][k-1]+dp[k+1][r]+a[k]+b[l-1]+b[r+1]);


注意的地方就是把端点处理一下。

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
//ctrl shift o 
//Array.fill(dp[i],inf)
class MyInputStream extends InputStream{
	public BufferedInputStream bis=new BufferedInputStream(System.in);
	public int read() throws IOException{
		int i;
		while((i = bis.read())<48) {
			if(i==-1)
				return -1;
		}
		int temp=0;
		while(i>47) {
			temp=temp*10+i-48;
			i=bis.read();
		}
		return temp;
	}
}
public class Main {
	static int INF=(int)1e9;
	static final int maxn=505;
	static long [][]dp=new long[maxn][maxn];
	static int []a=new int[maxn];
	static int []b=new int[maxn];
	
	public static int gcd(int a,int b) {
		if(a<b) return gcd(b,a);
		if(a%b==0) 
			return b;
		return gcd(b,a%b);
	}
	private static MyInputStream cin;
	public static void main(String[] args) throws IOException{
		cin = new MyInputStream();
		int t=cin.read();
		for(int cas=1;cas<=t;cas++){
			int n=cin.read();
			for(int i=1;i<=n;i++) {
				a[i]=cin.read();
			}
			for(int i=1;i<=n;i++) {
				b[i]=cin.read();
			}
			for(int i=1;i<=n;i++) {
				for(int j=i;j<=n;j++) {
					dp[i][j]=INF;
				}
			}
			b[0]=0;
			b[n+1]=0;
			for(int i=0;i<=n;i++) {
				dp[0][i]=0;
				dp[i][n+1]=0;
			}
			int len;
			for(len=1;len<=n;len++) {
				for(int l=1;l<=n-len+1;l++) {
					int r=l+len-1;
					for(int k=l;k<=r;k++) {
						dp[l][r]=Math.min(dp[l][r],dp[l][k-1]+
								dp[k+1][r]+a[k]+b[l-1]+b[r+1]);
					}
				}
			}
			System.out.printf("Case #%d: ",cas);
			System.out.println(dp[1][n]);
		}

	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值