17098 广告牌最佳安放问题

时间:2021-05-15 04:21:19

17098 广告牌最佳安放问题

时间限制:1000MS  内存限制:65535K
提交次数:0 通过次数:0

题型: 编程题   语言: G++;GCC;VC

 

Description

有一条路从西向东M公里,是一段旅行的公路。

在这段公路上放置n块广告牌,广告牌的地点:x1,x2,...,xn。
如果你放一块广告牌在地点xi,就能获得ri的收益(ri>0)。

该地公路局规定:两块广告牌不能小于或等于5公里。

现在请你挑选并安排这些广告牌放置地点,使得你的总收益在公路局规定的限制下达到最大。




输入格式

第一行:公路长度M,广告牌的总数n,中间空格。(M<100000, n<M)
第二行:广告牌安置地点向量:x1 x2 ... xn
第三行:广告牌安置收益向量:r1 r2 ... rn



输出格式

第一行:最大总收益。



 

输入样例

20 4
6 7 12 14
5 6 5 1



 

输出样例

10

解释:这里指挑选1和3号广告牌是效益最优(总效益为10)且符合公路局规定的方案。



 

提示

定义符号:
广告牌安置地点向量:x1 x2 ... xn
广告牌安置收益向量:r1 r2 ... rn

假设d[i]表示:从西向东到第i个广告牌地点xi处,可选择放置广告牌的最大效益值。
(1)i=1时,d[1]=r1;
(2)i>1时,d[i]=max{d[i-1],d[j]+ri | for all possible j, 1<=j<=i && si-sj>5 }

d[n]就是原问题所求的符合公路局规定的最大广告效益和。








我的代码实现:
#include<stdio.h>
#define N 100005
int d[N];
//(1)i=1时,d[1]=r1;
//(2)i>1时,d[i]=max{d[i-1],d[j]+ri | for all possible j, 1<=j<=i && si-sj>5 }
//
//
int max(int x,int y){
return x>y?x:y;
}

void ff(int *x,int *r,int n){
d[
1]=r[1];
int maxx;
for(int i=2;i<=n;i++){
maxx
=0;//记录d[j]+ri的最大值
for(int j=1;j<=i;j++){//此处maxx不能从d[1]+ri开始,因为会误导后面max()的判断。以及j应该从1开始,不要从2开始
if((x[i]-x[j]>5)&&(maxx<d[j]+r[i]))
maxx
=d[j]+r[i];
}
d[i]
=max(d[i-1],maxx);
}
}


int main(){
int x[N],r[N];
int n,m;
scanf(
"%d %d",&m,&n);
for(int i=1;i<=n;i++){
scanf(
"%d",&x[i]);
}
for(int i=1;i<=n;i++){
scanf(
"%d",&r[i]);
}
ff(x,r,n);
printf(
"%d ",d[n]);
return 0;
}