滚动dp模板

给出一个整数 N,和一个长度为 N 的数组 B. 对于满足 1<=A[i]<=B[i]的长度为 N 的数组 A,
我们定义它的价值为相邻两项的差的绝对值之和. 求出价值最大是多少.
输入格式
第一行包含一个整数 N, 代表数组的长度. 接下来一行 N 个整数,第 i 个整数为 B[i].
输出格式
输出一个整数.
样例输入
5
10 1 10 1 10
样例输出
36
数据范围
对于 20%的数据, N <= 8, B[i] <= 8.
对于 40%的数据, N <= 1,000, B[i] <= 1,000.
对于 60%的数据, N <= 1,000.
对于 100%的数据, 1 <= B[i], N <= 1,000,000.

 

贪心,每个数取最大或最小值

滚动dp

#include <cstdio>
#include <cmath>
#include <bits/stdc++.h>
#include <algorithm>
using namespace std;
#define MAXN 1000000+5
#define R register
template <typename T>
inline void read(T &x)
{
        #define C getchar()
        char a=C;x=0;bool f=0;
        for(;a>'9'||a<'0';a=C) if(a=='-') f=1;
        for(;a>='0'&&a<='9';a=C) x=(x<<1)+(x<<3)+(a^48);
        if(f) x=-x;
}
int n,b[MAXN];
long long f[2][2];
int main()
{
    freopen("b.in","r",stdin);
    freopen("b.out","w",stdout);
    read(n);
    for(R int i=1;i<=n;i++) read(b[i]);
    R int now=0,last;
    for(R int i=2;i<=n;i++)
    {
            last=now;now^=1;
            f[now][0]=f[now][1]=0;
            f[now][0]=max(f[last][0],f[last][1]+b[i]-1);
            f[now][1]=max(f[last][1],f[last][0]+b[i-1]-1);
    }
    printf("%lld",max(f[now][1],f[now][0]));
    return 0;
}

 

转载于:https://www.cnblogs.com/000226wrp/p/11336178.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值