频道栏目
首页 > 资讯 > C++ > 正文

HDU5115 Dire Wolf 区间DP 记忆化搜索

14-12-06        来源:[db:作者]  
收藏   我要投稿

题意:举个例子,就跟DOTA里的狼BB一样,自身有攻击力,还有光环可以提升同伴的攻击力,狼站成一排,光环只能提供给相邻的狼,打掉一直狼需要打一下,同时它也会打一下,这样你的扣血量其实就等于该狼的攻击力


方程很好想,dp[i][j]代表 打掉区间[i,j]内的狼所需最少血量,这里是闭区间,后来看到是200*200 ,那么就懒得去想方程转移了,直接记忆化搜索就可以了,注意点是 一个狼被宰了,它相邻两边的两只狼攻击力会减少,所以搜索过程 分区间搜索时边界要设定好,一开始没弄好 结果 案例一直没跑出来,这深搜调试起来还是比较麻烦的,直接由区间[i,j]里面开始分着搜 [i,k - 1] [k + 1,j],一直分下去,这样跑出来 700ms,题目给了5s,估计这题目有比较秒的方法 加上 暴力做出来的,


int t;

int n;

int aa[200 + 55],bb[200 + 55];

int dp[200 + 55][200 + 55];

int Case = 0;

void init() {
	memset(dp,-1,sizeof(dp));
	memset(aa,0,sizeof(aa));
	memset(bb,0,sizeof(bb));
}

bool input() {
	while(cin>>n) {
		for(int i=1;i<=n;i++)cin>>aa[i];
		for(int i=1;i<=n;i++)cin>>bb[i];
		return false;
	}
	return true;
}

int dfs(int l,int r) {
	if(dp[l][r] != -1)return dp[l][r];
	//cout<<><><><>= i + 1)tmp += dfs(i + 1,r);
		now = min(now,tmp);
	}
	return dp[l][r] = now + bb[l - 1] + bb[r + 1];
}
 
void cal() {
	dfs(1,n);
	printf("Case #%d: ",++Case);
	cout<<>>t;
	while(t--) {
		init();
		if(input())return 0;
		cal();
		output();
	}
	return 0;
}




相关TAG标签
上一篇:HDU4281 Judges' response(状态压缩+01背包+分组背包)经典
下一篇:HDU 1520Anniversary party 树形DP入门
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站