码迷,mamicode.com
首页 > 其他好文 > 详细

luogu1970 花匠(dp)

时间:2018-09-13 23:11:27      阅读:146      评论:0      收藏:0      [点我收藏+]

标签:div   更新   pair   using   表示   etc   define   const   char   

设f1[i]表示以1..i中某个合法序列的长度,而且最后一位是较大的

f2[i]表示以1..i中某个合法序列的长度,而且最后一位是较小的

那么就有$f1[i]=max\{f2[j]+1\},(j<i,h[j]<h[i])$,f2同理

本来想直接建线段树来维护这个最大值的,但是似乎不需要:

对于f1,如果h[i-1]<h[i],那显然从i-1更新过来比较好;但如果h[i-1]>h[i],那其实f[i]=f[i-1],因为这种情况中选i-1一定是比i不亏的,因为i-1更大一点。

f2同理

 1 #include<bits/stdc++.h>
 2 #define pa pair<int,int>
 3 #define ll long long
 4 using namespace std;
 5 const int maxn=100010;
 6 
 7 inline ll rd(){
 8     ll x=0;char c=getchar();int neg=1;
 9     while(c<0||c>9){if(c==-) neg=-1;c=getchar();}
10     while(c>=0&&c<=9) x=x*10+c-0,c=getchar();
11     return x*neg;
12 }
13 
14 int N,h[maxn];
15 int f1[maxn],f2[maxn];
16 
17 int main(){
18     int i,j,k;
19     N=rd();
20     for(i=1;i<=N;i++) h[i]=rd();
21     f1[1]=f2[1]=1;
22     for(i=2;i<=N;i++){
23         if(h[i]>=h[i-1]) f1[i]=f1[i-1];
24         else f1[i]=f2[i-1]+1;
25         if(h[i]<=h[i-1]) f2[i]=f2[i-1];
26         else f2[i]=f1[i-1]+1;
27     }
28     printf("%d\n",max(f1[N],f2[N]));
29     return 0;
30 }

 

luogu1970 花匠(dp)

标签:div   更新   pair   using   表示   etc   define   const   char   

原文地址:https://www.cnblogs.com/Ressed/p/9643782.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!