51nod 1270 数组的最大代价

来源:互联网 发布:软件版权声明 编辑:程序博客网 时间:2024/05/23 02:06

题目链接:

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1270

题解:

题目本身不难,但是题目的大意自己读了很久才理解。
题目就是让你自己创建大小为n的数组,其中里面元素的值的范围为[1,b[i]]注意这里是闭区间,问你,求你自己构建的a数组的最大代价是多少。
思路其实很简单,首先我们可以直接用贪心的思想去考虑,a[i]的元素只肯能是1或则是b[i]。下面的话,就是一个比较简单的dp,直接看代码。

代码:

#include <cmath>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;#define met(a,b) memset(a,b,sizeof(a))#define inf 0x3f3f3f3fconst int maxn = 5e4+10;int num[maxn];int dp[maxn][2];int main(){    int n;    while(scanf("%d",&n)!=EOF)    {        for(int i=1;i<=n;i++)            scanf("%d",&num[i]);        met(dp,0);        for(int i=2;i<=n;i++)        {            dp[i][0]=max(dp[i-1][1]+abs(num[i-1]-1),dp[i-1][0]);            //           dp[i][0]表示这个数字是1,所以,它的最大值就是前者减去1,或则是它本身。            dp[i][1]=max(dp[i-1][0]+abs(num[i]-1),dp[i-1][1]+abs(num[i]-num[i-1]));            //            dp[i][1]表示这个数字是有他的本身所构成的。        }        printf("%d\n",max(dp[n][0],dp[n][1]));    }}
0 0