51nod1270 数组的最大代价(简单dp)

---恢复内容开始---

1270 数组的最大代价

题目来源: HackerRank

基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题

 收藏

 关注

数组A包含N个元素A1, A2......AN。数组B包含N个元素B1, B2......BN。并且数组A中的每一个元素Ai,都满足1 <= Ai <= Bi。数组A的代价定义如下:

(公式表示所有两个相邻元素的差的绝对值之和)

给出数组B,计算可能的最大代价S。

Input

第1行:1个数N,表示数组的长度(1 <= N <= 50000)。
第2 - N+1行:每行1个数,对应数组元素Bi(1 <= Bi <= 10000)。

Output

输出最大代价S。

Input示例

5
10
1
10
1
10

Output示例

36看到这道题首先想到的就要|Ai-A(i-1)|最大,这A数组只可能是1或者Bi则分别考虑1或者是Bi时候的情况;就可以得到递推公式:dp[i][0]=max(dp[i-1][0],dp[i-1][1]+abs(1-b[i-1]));        //表示A[i]为1的情况dp[i][1]=max(dp[i-1][0]+abs(b[i]-1]),dp[i-1][1]+abs(b[i]-b[i-1]));//表示A[i]为Bi的情况
#include<stdio.h>
#include<algorithm>
#include<iostream>
using namespace std;
int b[50005];
int dp[50005][2];
int main(){
    int n;
    scanf("%d",&n);
    int i;
    for(i=0;i<n;i++)
        scanf("%d",&b[i]);
    for(i=1;i<n;i++){
        dp[i][0]=max(dp[i-1][0],dp[i-1][1]+abs(1-b[i-1]));
        dp[i][1]=max(dp[i-1][0]+abs(b[i]-1),dp[i-1][1]+abs(b[i]-b[i-1]));
    }
    printf("%d\n",max(dp[n-1][0],dp[n-1][1]));
}

  

---恢复内容结束---

时间: 2024-10-15 08:21:57

51nod1270 数组的最大代价(简单dp)的相关文章

POJ 3666 Making the Grade(数列变成非降序/非升序数组的最小代价,dp)

传送门: http://poj.org/problem?id=3666 Making the Grade Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9468   Accepted: 4406 Description A straight dirt road connects two fields on FJ's farm, but it changes elevation more than FJ would lik

计蒜客-跳跃游戏二 (简单dp)

题目链接:https://nanti.jisuanke.com/t/20                                                            跳跃游戏二 给定一个非负整数数组,假定你的初始位置为数组第一个下标.数组中的每个元素代表你在那个位置能够跳跃的最大长度.你的目标是到达最后一个下标,并且使用最少的跳跃次数. 例如: A = [2,3,1,1,4],到达最后一个下标的最少跳跃次数为 2.(先跳跃 1 步,从下标 0 到 1,然后跳跃 3 步,

hdu1501 Zipper[简单DP]

题目地址 hdu1501 题干 代码和解释 最优子结构分析:设这三个字符串分别为a.b.c,如果a.b可以组成c,那么c的最后一个字母必定来自a或者b的最后一个字母.c去除最后一位,就变成由a-1和b或者a和b-1构成c-1的问题. 状态转移方程:DP[i][j]表示c中i个字符来自于a,j个字符来自于b,即由a的前i个字符和b的前j个字符组成c的前i+j个字符.DP[i][j]为1则真,为0则假. /*给3个字符串,让你判断能不能组合前两个字符串来获得第3个字符串.前两个字符串可以被任意混合,

POJ 3250 Bad Hair Day 简单DP 好题

Description Some of Farmer John's N cows (1 ≤ N ≤ 80,000) are having a bad hair day! Since each cow is self-conscious about her messy hairstyle, FJ wants to count the number of other cows that can see the top of other cows' heads. Each cow i has a sp

hdu1207 汉诺塔II 简单dp

本文出自:http://blog.csdn.net/svitter 题意:汉诺塔,多了一根柱子,问你寻找最快的移动次数. dp [ n ] = dp [ n - j ] * 2 + pow( 2, j ) - 1; 就是把j个汉诺塔移到一根上dp[ n - j ],然后就是普通的汉诺塔问题,即2^n - 1次移动, 然后把剩下的移动过去dp [ n - j ]. 注意pow(2, j )可能超出long long int范围.写二的次方的时候也可用移位算法. #include <iostream

POJ1088:滑雪(简单dp)

题目链接:  http://poj.org/problem?id=1088 题目要求: 一个人可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减小.求可以滑落的最长长度. 题目解析: 首先要先排一下序,因为只能高度递减才能滑行.之后就很简单了,就是简单DP. 即:要求的滑坡是一条节点递减并依次相邻的最长路径,可以先根据高度将所有的点进行排序,在i点的时候,遍历0~i-1个点(升序排序,i前面的点的高度一定小于等于i),取相邻点间的大的路径长度 代码如下: #include <iostream

hdu 1087 简单dp

思路和2391一样的.. <span style="font-size:24px;">#include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> using namespace std; const int inf=(0x7f7f7f7f); int main() { int a; int s[10005]; int w[10005];

hdu1087 简单DP

I - 简单dp 例题扩展 Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Description Nowadays, a kind of chess game called “Super Jumping! Jumping! Jumping!” is very popular in HD

2014 HDU多校弟九场I题 不会DP也能水出来的简单DP题

听了ZWK大大的思路,就立马1A了 思路是这样的: 算最小GPA的时候,首先每个科目分配到69分(不足的话直接输出GPA 2),然后FOR循环下来使REMAIN POINT减少,每个科目的上限加到100即可 算最大GPA的时候,首先每个科目分配到60分,然后FOR循环下来使REMAIN POINT减少,每个科目的上限加到85即可,如果还有REMAIN POINT,就FOR循环下来加到100上限即可 不会DP 阿 QAQ 过段时间得好好看DP了  =  = 于是默默的把这题标记为<水题集> //