【2013】

D2T2  花匠

我觉得这道题还是比较有趣的。它不是DP题,但用到了DP的思想,所以学习算法时一定要理解原理、应用和思想。

这是不带注释版:

#include<bits/stdc++.h>
#define ri register int
#define ll long long
#define For(i,l,r) for(ri i=l;i<=r;i++)
#define Dfor(i,r,l) for(ri i=r;i>=l;i--)
using namespace std;
const int M=1e6+6;
ll a[M],big[M],sma[M],n,ans;
inline ll read(){
    ll f=1,sum=0;
    char ch=getchar();
    while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
    while(isdigit(ch)){sum=(sum<<1)+(sum<<3)+(ch^48);ch=getchar();}
    return f*sum;
}
int main(){
    n=read();
    For(i,1,n) a[i]=read();
    big[1]=sma[1]=1;
    For(i,2,n){
        if(a[i]>a[i-1]) big[i]=max(big[i-1],sma[i-1]+1),sma[i]=sma[i-1];
        else{
            if(a[i]<a[i-1]) sma[i]=max(sma[i-1],big[i-1]+1),big[i]=big[i-1];
            else big[i]=big[i-1],sma[i]=sma[i-1];
        }
    }
    ans=max(big[n],sma[n]);
    printf("%lld\n",ans);
    return 0;
}
View Code

这是带注释版(我学习别人写的这篇,写的上面的码):

#include<iostream>
#include<cstdio>
#define II int
#define R register
#define I 123456
using namespace std;

II a[I],d_1[I],d_2[I];

II n;

int main()
{
//  freopen("FlowerNOIP2013.in","r",stdin);
//  freopen("FlowerNOIP2013.out","w",stdout);
    scanf("%d",&n);
    R II x;
    for(R II i=1;i<=n;i++) scanf("%d",&x), a[i]=x;
    d_1[1]=d_2[1]=1;
    //d_1[]代表的是当前元素是以当前元素为中心的三个相邻的元素中最大的;
    //同理,d_2[]代表的是当前元素是以当前元素为中心的三个相邻的元素中最小的;
    //但是当前元素不一定选,可能是继承上一个元素的信息;
    for(R II i=2;i<=n;i++)
    {
        if(a[i]>a[i-1]) d_1[i]=max(d_1[i-1],d_2[i-1]+1), d_2[i]=d_2[i-1];
        //如果当前元素大于这个前一个元素;
        //那么当前元素若果选,则是前一个元素作为最低点时的长度+1;
        //如果不选,就继承前一个元素作为最高点,等价于当前元素作为最高点;
        //当前元素作为最低点就只能继承前一个点作为最低点;
            else{
                if(a[i]<a[i-1]) d_1[i]=d_1[i-1], d_2[i]=max(d_1[i-1]+1,d_2[i-1]);
                //如果当前元素小于前一个元素,则道理同上,只是反过来;
                    else d_1[i]=d_1[i-1],   d_2[i]=d_2[i-1];
                    //如果当前元素等于前一个元素,那么这个元素直接继承前一个元素的所有信息;
                    //因为这两个点是完全等价的;
            }
    }
    R II ans=max(d_1[n],d_2[n]);
    //我们在最后时取两种状态的最大值作为答案;
    cout<<ans<<endl;
    return 0;
}
View Code

猜你喜欢

转载自www.cnblogs.com/jian-song/p/11869142.html