题目描述
你是能看到第一题的 friends呢。
—— hja
?座楼房,立于城中 。
第?座楼,高度 ℎ?。
你需要一开始选择座楼,跳。 在第 ?座楼准备跳需要 ??的花费。 每次可以跳到任何一个还没有过的楼上去。但是代价,另外一座楼的代价是两高度差绝对值 ,最后一次从楼上跳到地面不需 要代价(只能跳到地上一次)。为在不超过 要代价(只能跳到地上一次)。为在不超过 ?的情况下,最多跳几次楼。 (一座楼 只能 跳一次 ,且每次 跳楼 都要 计算 准备 的花费 )
输入输出格式
输入格式:
第一行个整数 ?,代表 楼的数量。
接下来一行 ?个整数代表 ??。
接下来一行 ?个整数代表 ℎ?。
最后一行个整数 ?。
输出格式:
一行个整数 代表答案 。
输入输出样例
输入样例#1:
4
3 5 4 11
2 1 3 1
17
输出样例#1:
3
【样例解释】
从1号楼跳到 2号楼再跳到 3号楼是一种 可行 的方案 。
说明
对于 30%的数据, 1≤?≤5。
对于另外 20%的数据,所有 ℎ?相同。
对于另外 20%的数据, ??=0。
P104 zhx 遭遇
第 3 页 共 6 页
对于 100%的数据, 1≤?≤50,1≤??,ℎ?≤106,1≤?≤107。
dp[i][j]表示前i座城市,走j步的最小花费
#include<cstdio>
#include<cstring>
#include<algorithm>
int n;
inline int read() {
int x=0,f=1;
char c=getchar() ;
while(c<'0'||c>'9') {
if(c=='-')f=-1;
c=getchar();
}
while(c>='0'&&c<='9')
x=x*10+c-'0',c=getchar();
return x*f;
}
const int maxn = 106;
struct node{
int h,w;
bool operator < (const node & a)const {
return h<a.h;
}
}bul[maxn];
int dp[maxn][maxn];//表示前i座城市,走j步的最小话费
int main() {
n=read();int ca;
for(int i=1;i<=n;++i) bul[i].w=read();
for(int i=1;i<=n;++i) bul[i].h=read();
std::memset(dp,0x3f,sizeof dp) ;
for(int i=1;i<=n;++i)dp[i][0]=0;
std::sort(bul+1,bul+n+1);
for (int i=1;i<=n;++i)
for (int j=1;j<=i+1;++j)
for(int k=1;k<i;++k) {
dp[i][j]=std::min(dp[i][j],(dp[k][j-1]+bul[k].w+abs(bul[k].h-bul[i].h)));
}
int ans=0;
ca=read();
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
if(dp[i][j]+bul[i].w<=ca) {
ans=std::max(j,ans);
}
printf("%d
",ans+1);
return 0;
}