题解,附py版
2026-07-23 11:28:45
发布于:福建
15阅读
0回复
0点赞
cpp版和py版用的思路是一致的,py版相对会更易读,但是没AC,cpp版是AC的。
py版:
n=int(input())
h=list(map(int,input().split()))#输入数据并整理
dp=[0]*n#对于c而言是初始化一个数组,其中dp[n]表示从起点到第n-1层的最低代价
def mian(n):#细节mian
global h,dp#py是需要手动声明全局变量的
dp[1]=abs(h[1]-h[0])#从起点到第二层
dp[2]=min(dp[1]+abs(h[2]-h[1]),h[2]-h[0])#从起点到第三层,会有两种可能性,需要取最小值
if n<3:
return(dp[n])#到这里先设置分支结束程序,防止后续超索引或死循环
for i in range(3,n):
dp[i]=min(dp[i-1]+abs(h[i]-h[i-1]),dp[i-2]+abs(h[i]-h[i-2]))#从起点到第i+1层
#到这里的循环时间复杂度为O(n),空间复杂度为O(n),但事实上空间上可以再优化,留作习题
return(dp[n-1])#输出最后一项,即终点
print(mian(n))#打印
由此可见这里给出的思路是自下而上地递推,时间的优化良好,空间上可以进一步压缩。
接下来是C++的实现:
#include<bits/stdc++.h>//经典万能头
using namespace std;
int main(){
long long int n;//多次调试表明所有int都要加longlong
cin>>n;
long long int h[n+10];
for(int i=1;i<=n;i++){
cin>>h[i];//输入数据并整理
}long long int dp[n+10];//从这里开始的算法同py
dp[2]=abs(h[2]-h[1]);
dp[3]=min(dp[2]+abs(h[3]-h[2]),abs(h[3]-h[1]));
if(n<=3){cout<<dp[n]<<endl;return 0;}
else{
for(int i=4;i<=n;i++){
dp[i]=min(dp[i-1]+abs(h[i]-h[i-1]),dp[i-2]+abs(h[i]-h[i-2]));
}cout<<dp[n]<<endl;
return 0;
}
}
这里空空如也


有帮助,赞一个