51nod 1270 数组的最大代价 思路:简单动态规划

这题是看起来很复杂,但是换个思路就简单了的题目。

首先每个点要么取b[i],要么取1,因为取中间值毫无意义,不能增加最大代价S。

用一个二维数组做动态规划就很简单了。

dp[i][0]表示第i个点取1时(第0-i个点)得到的最大代价之和。

dp[i][1]表示第i个点取b[i]时(第0-i个点)得到的最大代价之和。

每一个都由前面两个推出。

#include <bits\stdc++.h>
using namespace std;

int a[50005];
int dp[50005][2]; // dp[][0]表示取1,dp[][1]表示取a[i]
int main(){
    int n;
    cin >> n;
    for(int i = 0;i < n; i++){
        cin >> a[i];
    }

    for(int i = 1;i < n; i++){
        dp[i][0] = max(abs(1-1)+dp[i-1][0],    // 第i个为1 ,第i-1个为1
                            abs(1-a[i-1])+dp[i-1][1]);   // 第i个为1 ,第i-1个为a[i-1]
        dp[i][1] = max(abs(a[i]-1)+dp[i-1][0], // 第i个为a[i] ,第i-1个为1
                            abs(a[i]-a[i-1])+dp[i-1][1]);// 第i个为a[i] ,第i-1个为a[i-1]
    }
//    for(int i = 0;i < n; i++){
//        cout << dp[i][0] << " " << dp[i][1] << endl;
//    }
    cout << max(dp[n-1][0],dp[n-1][1]) << endl; //答案为最后一组中的最大的那个
    return 0;
} 
时间: 2024-10-11 09:47:18

51nod 1270 数组的最大代价 思路:简单动态规划的相关文章

51nod 1270 数组的最大代价

感觉自己最近状态好差劲啊 做题都得提前看一下题解 不过这题也没那么难,可以大概知道的是  如果要满足代价最大,A[i]的值不是1就是B[i] #include<bits/stdc++.h> using namespace std; int s[50010],dp[50010][2]; int main () { int n; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&s[i]

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,表示数组的长度(

1270 数组的最大代价 dp

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1270&judgeId=194704 一开始贪心,以为就两种情况,大.小.大.小.....这样下去 小.大.小.大.....这样下去, 结果翻车.比如1.2.1.1.2.1这个样例 就不行了. 那么以dp[i][0]表示前i个数,第i个数选了小的数字,能产生的最大差值, dp[i][1]同理,转移的时候,上一唯也是两种情况,所以一共4中情况. #include <cs

C语言去除数组中重复的字符简单例子

#include <stdio.h> int main(void){ int a[10]={1,2,3,3,4,5,1,3,5,6}; int i,j; int zieo=0; for(i=0;i<10;i++) for(j=i+1;j<10;j++) { if(a[i]==a[j]) { a[j]=0; } } for(i=0;i<10;i++) { if(a[i]!=zieo) { printf("%d\t",a[i]); } } printf(&qu

简单动态规划问题分析

例题: 1022: 菜鸟和大牛(csuoj) 像这一类问题,首先不管是属于什么类型的,如果是按照题目的思路一步步走下来,然后运行,最后肯定是要超时的,究其原因,它的时间复杂度很不合理,最后是呈现指数增长的方式的.ACM本来就是研究最优算法的,所以不管结果如何,这个方法绝对不是优先选择的. 然后通过由下向上进行分析求解,会发现虽然思考问题的方式改变并不大,但是最后的大部分结果在还没有进行大量的运算之前就被我们排除了.这个方法的名字并不重要,重要的是以后解题时这种方法都应该是自己优先考虑的. 简单动

HDUOJ----2571(命运)(简单动态规划)

命运 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 8600    Accepted Submission(s): 3032 Problem Description 穿过幽谷意味着离大魔王lemon已经无限接近了! 可谁能想到,yifenfei在斩杀了一些虾兵蟹将后,却再次面临命运大迷宫的考验,这是魔王lemon设下的又一个机关.要知

bzoj 1270: [BeijingWc2008]雷涛的小猫 简单dp+滚动数组

1270: [BeijingWc2008]雷涛的小猫 Time Limit: 50 Sec  Memory Limit: 162 MB[Submit][Status][Discuss] Description   Input Output Sample Input Sample Output 8 HINT 思路:保存i+z的max值:上一行的dp值: #include<bits/stdc++.h> using namespace std; #define ll __int64 #define

51nod 1270 dp

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1270 简单的线性dp,最近狂刷水题真的是...药丸 差值最大得话要么是峰顶要么是最小的1,不可能处在中间状态,那样显然没有峰值的贡献大,想通这一点之后方程就好写了, dp[i][0]表示第i个数取最小值的最大代价,dp[i][1]相反. 有 dp[i][0]=max(dp[i-1][0],dp[i-1][1]+a[i-1]-1); dp[i][1]=max(dp[i-1

leetCode 26.Remove Duplicates from Sorted Array(删除数组重复点) 解题思路和方法

Remove Duplicates from Sorted Array Given a sorted array, remove the duplicates in place such that each element appear only once and return the new length. Do not allocate extra space for another array, you must do this in place with constant memory.