记忆化搜索专题--nkoj3699送比萨

原创 2016年08月28日 20:11:18
P3699送披萨
时间限制 : - MS   空间限制 : 65536 KB 
评测说明 : 时限2000ms
问题描述

  何老板开了一家披萨店,有一天突然收到了n个客户的订单。
  何老板所在的城市只有一条笔直的大街,我们可以将它想象成数轴,其中位置0是何老板的披萨店,第i个客户所在的位置为Pi,每个客户的位置都不同。如果何老板给第i个客户送披萨,客户会支付Ei-Ti块钱,其中Ti是何老板到达他家的时刻。当然,如果到得太晚,会使得Ei-Ti<0,这时,何老板可以选择不给他送餐,免得他反过来找何老板要钱。
  何老板店里面只有一个送餐车(单位时间行驶单位长度的距离),因此只能往返送餐,如下图所示就是一条线路,图中第一行的数字是位置Pi,第二行是Ei。

你的任务是帮助何老板计算出最大的收益。

输入格式

第一行,一个整数n
第二行,n个空格间隔的整数,从左往右给出了每个客户的位置Pi,即P1,P2,......,Pn
第三行,n个空格间隔的整数,从左往右给出了每个客户对应的Ei,即E1,E2,......,En

输出格式

一行,一个整数,表示所求的最佳收益

样例输入 1

5
-6 -3 -1 2 5
27 10 2 5 20

样例输出 1

32

样例输入 2

6
1 2 4 7 11 14
3 6 2 5 18 10

样例输出 2

13

样例输入 3

11
-14 -13 -12 -11 -10 1 2 3 4 5 100
200 200 200 200 200 200 200 200 200 200 200

样例输出 3

1937

提示

1 ≤ n ≤ 100
-100,000 ≤ Pi ≤ 100,000  且Pi!=0
0< Ei ≤ 100,000



#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<cstring>
using namespace std;
int f[205][205][205][2];
bool mark[205][205][205][2];
int n;
int pos[205],e[205],start;
int dp(int l,int r,int cnt,int p){
	int i;
	if(mark[l][r][cnt][p])return f[l][r][cnt][p];
	mark[l][r][cnt][p]=true;
	if(cnt==0)return f[l][r][cnt][p]=0;
	if(p==0){
		for(i=1;i<l;i++){
			f[l][r][cnt][p]=max(f[l][r][cnt][p],dp(i,r,cnt-1,0)+e[i]-cnt*abs(pos[l]-pos[i]));
		}
		for(i=r+1;i<=n+1;i++){
			f[l][r][cnt][p]=max(f[l][r][cnt][p],dp(l,i,cnt-1,1)+e[i]-cnt*abs(pos[l]-pos[i]));
		}
	}
	else{
		for(i=1;i<l;i++){
			f[l][r][cnt][p]=max(f[l][r][cnt][p],dp(i,r,cnt-1,0)+e[i]-cnt*abs(pos[r]-pos[i]));
		}
		for(i=r+1;i<=n+1;i++){
			f[l][r][cnt][p]=max(f[l][r][cnt][p],dp(l,i,cnt-1,1)+e[i]-cnt*abs(pos[r]-pos[i]));
		}
	}
	return f[l][r][cnt][p];
}
int main(){
	int i,j,ans=0;
	start=0;
	cin>>n;
	for(i=1;i<=n+1;i++){
		cin>>pos[i];
		if(pos[i]>0&&start==0){
			start=i;
			pos[i+1]=pos[i];
			pos[i]=0;
			i++;
		}
	}
	for(i=1;i<=n+1;i++){
		cin>>e[i];
		if(start==i){
			e[i+1]=e[i];
			e[i]=0;
			i++;
		}
	}
	for(i=0;i<=n;i++){
		ans=max(ans,dp(start,start,i,0));
	}
	cout<<ans;
}



版权声明:本文为博主原创文章,未经博主允许不得转载。

HDOJ1078 记忆化搜索入门题 有详细的记忆化搜索模板程序

FatMouse and Cheese Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Oth...
  • computer_user
  • computer_user
  • 2017年08月11日 10:18
  • 196

记忆化搜索专题

什么是记忆化搜索呢?搜索的低效在于没有能够很好地处理重叠子问题;动态规划虽然比较好地处理了重叠子问题,但是在有些拓扑关系比较复杂的题目面前,又显得无奈。记忆化搜索正是在这样的情况下产生的,它采用搜索的...
  • hjf1201
  • hjf1201
  • 2017年11月30日 20:54
  • 233

记忆化搜索简介

记忆化搜索:算法上依然是搜索的流程,但是搜索到的一些解用动态规划的那种思想和模式作一些保存。 一般说来,动态规划总要遍历所有的状态,而搜索可以排除一些无效状态。 更重要的是搜索还可以剪枝,可能剪去...
  • ILECY
  • ILECY
  • 2016年03月12日 20:03
  • 2496

poj1088 dp 记忆化搜索 (入门好题)

题目意思很简单,一开始我直接DFS深搜,超时果果的,看了题解以后,学习了记忆化搜索,就是记录下已经求出的当前结点的最大值,在之后访问到这个节点时,就能直接调用结果,减少重复计算。是一道好题。 以下为...
  • lizy3838
  • lizy3838
  • 2016年02月03日 22:38
  • 498

动态规划、记忆化搜索、Dijkstra算法的总结

动态规划        动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。动态规划算法与分治法类似,其基本思想也是...
  • Lieacui
  • Lieacui
  • 2016年06月24日 10:34
  • 2891

hdu 1428 挺好的一个题目 记忆化搜索+广搜实现迪杰斯特拉

漫步校园 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub...
  • lw277232240
  • lw277232240
  • 2017年06月23日 08:59
  • 154

【OJ】DP 01背包 记忆化搜索 O(nW)

/* 01背包 记忆化搜索 O(nW) */ #include #include #include #define MAX_N 101 #define MAX_W 3001 using namesp...
  • u014134180
  • u014134180
  • 2014年10月23日 20:24
  • 615

POJ 2704 Pascal's Travels (基础记忆化搜索)

POJ 2704 Pascal's Travels (基础记忆化搜索)
  • Tc_To_Top
  • Tc_To_Top
  • 2015年04月25日 21:35
  • 813

递归+记忆化搜索

边界条件与递归方程是递归函数的两个要素。 1)阶乘函数 直接打板子: Int fac(int n) { If (n==0) return 1; Else return n*fac(n-1); } 这里...
  • zjh_2017
  • zjh_2017
  • 2017年10月29日 07:22
  • 108

记忆化搜索与递推

数字三角型,P160页       递推计算: int i,j; for(j =1; j =1;i--) for(j=1;j...
  • AAguojia
  • AAguojia
  • 2011年08月15日 20:44
  • 622
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:记忆化搜索专题--nkoj3699送比萨
举报原因:
原因补充:

(最多只允许输入30个字)