zoukankan      html  css  js  c++  java
  • 【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
    ",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
  • 相关阅读:
    AS2 tween缓动
    flash 绑定 swc类文件
    jsfl自运行与被调运行
    一键清除fla文件中的TLF文本
    as 2的 Event.REMOVED_FROM_STAGE
    jsfl 添加代码
    jsfl 删除库指定内容
    文件上传待研究
    SpringMVC单文件上传、多文件上传、文件列表显示、文件下载
    shiro配置参考(二)可以和mybatis的配置放在一个文件中(不建议这样,可以拆分开来,注意相关配置即可)
  • 原文地址:https://www.cnblogs.com/jian-song/p/11869142.html
Copyright © 2011-2022 走看看