codeforces 484D kindergarten

来源:互联网 发布:网络推广 photoshop 编辑:程序博客网 时间:2024/05/16 16:56

刚开始没细读题目,直接快排后减了了一下,就交了上去,结果直接Wa。猥琐的看了数据,竟然发现两组数据只是位置不同,得到的答案竟然也不相同,觉得不妙。

题目大意:

给你一列数,让你把他们分成几个区间,每个区间的代表值为区间中数的最大值减去最小值,求总的代表值之和最大为多少?


如果一列数,a[i]....a[j],是单调递增的的,则这一段的最大代表值为a[j]-a[i].并加到计算递增数列的变量值上;如果出现转折点则转到另一个变量值上],加起来计算递减段的的代表值之和。

用dp可很好解决。

代码如下:


#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int maxn=1e6+5;int charisma[maxn];long long dp[maxn][2];int main(){    int n;    while(scanf("%d",&n)==1){        scanf("%d",charisma);        for(int i=1;i<n;i++){            scanf("%d",charisma+i);            if(charisma[i]>charisma[i-1]){                dp[i][0]=max(dp[i-1][1],dp[i-1][0]+charisma[i]-charisma[i-1]);                dp[i][1]=max(dp[i-1][0],dp[i-1][1]);            }            else{                dp[i][1]=max(dp[i-1][0],dp[i-1][1]+charisma[i-1]-charisma[i]);                dp[i][0]=max(dp[i-1][0],dp[i-1][1]);            }    }    printf("%I64d\n",max(dp[n-1][0],dp[n-1][1]));    }   return 0;}


0 0