题解 P6489 【[COCI2010-2011#6] USPON】
3分钟出思路,10分钟出代码(大佬发言)
乍一看:上升子序列问题
但是注意题中的要求,需要连续的高度严格递增的山路
所以我们的递推只需要
计算目前落差公式:
(a[i]点的高度, h[i]子序列目前落差)
放代码
#include<iostream>
using namespace std;
int n,a[100001],f[10001],h[10001];//a[i]—点的高度、f[i]上升子序列长度、h[i]子序列目前落差
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) {scanf("%d",&a[i]);f[i]=1;}//f[i]数组的初始化,每个数自己都是一个长度为一的上升序列
for(int i=2;i<=n;i++){
int j=i-1;//j来代替i-1,更加简洁
if(a[j]<a[i]){//i大于前一个
f[i]=f[j]+1;//则以i为结尾的上升子序列长度加一
h[i]=a[i]-a[j]+h[j];//落差加一
}
}
int maxx=-1;
for(int i=1;i<=n;i++) maxx=max(maxx,h[i]);//求最大落差
printf("%d",maxx);
return 0;//结束,拉闸拉闸拉闸
}
发现和第一篇题解相似,但完全是自己想的(勿喷)
谢谢大佬们赏脸~