您的位置:首页 > 其它

hdu 5115 区间dp 狼BUFF

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

输入要求:总共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]
);
}

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: